diff --git a/oauth2_provider/oauth2_backends.py b/oauth2_provider/oauth2_backends.py index 3ddb9c90b..0c43292af 100644 --- a/oauth2_provider/oauth2_backends.py +++ b/oauth2_provider/oauth2_backends.py @@ -1,5 +1,5 @@ import json -from urllib.parse import urlparse, urlunparse +from urllib.parse import unquote, urlparse, urlunparse from oauthlib import oauth2 from oauthlib.common import Request as OauthlibRequest @@ -238,6 +238,22 @@ def extract_body(self, request): return body +class JSONAndFormUrlencodedOAuthLibCore(JSONOAuthLibCore): + def extract_body(self, request): + # fixes base64 encoded form-submission. you can't control what all oauth clients use. + if request.content_type in ["application/x-www-form-urlencoded"]: + try: + query_string = request.body.decode("utf-8") + query_params = {p.split("=")[0]: unquote(p.split("=")[1]) for p in query_string.split("&")} + res = query_params.items() + + return res + except: + pass + + return super(JSONAndFormUrlencodedOAuthLibCore, self).extract_body(request) + + def get_oauthlib_core(): """ Utility function that returns an instance of