4
4
5
5
import logging
6
6
7
+ from django .http import HttpRequest
8
+
7
9
from oauthlib .common import Request
8
10
from oauthlib .oauth2 .rfc6749 .endpoints .token import TokenEndpoint
9
11
from oauthlib .oauth2 .rfc6749 .tokens import BearerToken
15
17
16
18
17
19
class SocialTokenServer (TokenEndpoint ):
20
+ """An endpoint used only for token generation.
18
21
19
- """An endpoint used only for token generation."""
22
+ Use this with the KeepRequestCore backend class.
23
+ """
20
24
21
25
def __init__ (self , request_validator , token_generator = None ,
22
26
token_expires_in = None , refresh_token_generator = None , ** kwargs ):
@@ -32,6 +36,7 @@ def __init__(self, request_validator, token_generator=None,
32
36
:param kwargs: Extra parameters to pass to authorization-,
33
37
token-, resource-, and revocation-endpoint constructors.
34
38
"""
39
+ self ._params = {}
35
40
refresh_grant = SocialTokenGrant (request_validator )
36
41
bearer = BearerToken (request_validator , token_generator ,
37
42
token_expires_in , refresh_token_generator )
@@ -41,17 +46,35 @@ def __init__(self, request_validator, token_generator=None,
41
46
},
42
47
default_token_type = bearer )
43
48
49
+ def set_request_object (self , request ):
50
+ """This should be called by the KeepRequestCore backend class before
51
+ calling `create_token_response` to store the Django request object.
52
+ """
53
+ if not isinstance (request , HttpRequest ):
54
+ raise TypeError (
55
+ "request must be an instance of 'django.http.HttpRequest'"
56
+ )
57
+ self ._params ['http_request' ] = request
58
+
59
+ def pop_request_object (self ):
60
+ """This is called internaly by `create_token_response`
61
+ to fetch the Django request object and cleanup class instance.
62
+ """
63
+ return self ._params .pop ('http_request' , None )
64
+
44
65
# We override this method just so we can pass the django request object
45
66
@catch_errors_and_unavailability
46
67
def create_token_response (self , uri , http_method = 'GET' , body = None ,
47
68
headers = None , credentials = None ):
48
69
"""Extract grant_type and route to the designated handler."""
49
- django_request = headers .pop ("Django-request-object" , None )
50
70
request = Request (
51
71
uri , http_method = http_method , body = body , headers = headers )
52
72
request .scopes = None
53
73
request .extra_credentials = credentials
54
- request .django_request = django_request
74
+
75
+ # Make sure we consume the django request object
76
+ request .django_request = self .pop_request_object ()
77
+
55
78
grant_type_handler = self .grant_types .get (request .grant_type ,
56
79
self .default_grant_type_handler )
57
80
log .debug ('Dispatching grant_type %s request to %r.' ,
0 commit comments