2020logger = logging .getLogger ("ansible_base.oauth2_provider.serializers.token" )
2121
2222
23- class BaseOAuth2TokenSerializer (CommonModelSerializer ):
23+ class OAuth2TokenSerializer (CommonModelSerializer ):
2424 refresh_token = SerializerMethodField ()
25- token = SerializerMethodField ()
25+
26+ unencrypted_token = None # Only used in POST so we can return the token in the response
27+ unencrypted_refresh_token = None # Only used in POST so we can return the refresh token in the response
2628
2729 class Meta :
2830 model = OAuth2AccessToken
@@ -40,23 +42,23 @@ class Meta:
4042 read_only_fields = ('user' , 'token' , 'expires' , 'refresh_token' )
4143 extra_kwargs = {'scope' : {'allow_null' : False , 'required' : False }, 'user' : {'allow_null' : False , 'required' : True }}
4244
43- def get_token (self , obj ) -> str :
44- request = self .context .get ('request' )
45- try :
46- if request and request .method == 'POST' :
47- return obj . token
48- else :
49- return ENCRYPTED_STRING
50- except ObjectDoesNotExist :
51- return ''
45+ def to_representation (self , instance ) :
46+ request = self .context .get ('request' , None )
47+ ret = super (). to_representation ( instance )
48+ if request and request .method == 'POST' :
49+ # If we're creating the token, show it. Otherwise, show the encrypted string.
50+ ret [ 'token' ] = self . unencrypted_token
51+ else :
52+ ret [ 'token' ] = ENCRYPTED_STRING
53+ return ret
5254
5355 def get_refresh_token (self , obj ) -> Optional [str ]:
5456 request = self .context .get ('request' )
5557 try :
5658 if not obj .refresh_token :
5759 return None
5860 elif request and request .method == 'POST' :
59- return getattr ( obj . refresh_token , 'token' , '' )
61+ return self . unencrypted_refresh_token
6062 else :
6163 return ENCRYPTED_STRING
6264 except ObjectDoesNotExist :
@@ -78,26 +80,30 @@ def validate_scope(self, value):
7880 raise ValidationError (_ ('Must be a simple space-separated string with allowed scopes {}.' ).format (SCOPES ))
7981 return value
8082
81- def create (self , validated_data ):
82- validated_data ['user' ] = self .context ['request' ].user
83- try :
84- return super ().create (validated_data )
85- except AccessDeniedError as e :
86- raise PermissionDenied (str (e ))
87-
88-
89- class OAuth2TokenSerializer (BaseOAuth2TokenSerializer ):
9083 def create (self , validated_data ):
9184 current_user = get_current_user ()
9285 validated_data ['token' ] = generate_token ()
9386 expires_delta = get_setting ('OAUTH2_PROVIDER' , {}).get ('ACCESS_TOKEN_EXPIRE_SECONDS' , 0 )
9487 if expires_delta == 0 :
9588 logger .warning ("OAUTH2_PROVIDER.ACCESS_TOKEN_EXPIRE_SECONDS was set to 0, creating token that has already expired" )
9689 validated_data ['expires' ] = now () + timedelta (seconds = expires_delta )
97- obj = super ().create (validated_data )
90+ validated_data ['user' ] = self .context ['request' ].user
91+ self .unencrypted_token = validated_data .get ('token' ) # Before it is hashed
92+
93+ try :
94+ obj = super ().create (validated_data )
95+ except AccessDeniedError as e :
96+ raise PermissionDenied (str (e ))
97+
9898 if obj .application and obj .application .user :
9999 obj .user = obj .application .user
100100 obj .save ()
101101 if obj .application :
102- OAuth2RefreshToken .objects .create (user = current_user , token = generate_token (), application = obj .application , access_token = obj )
102+ self .unencrypted_refresh_token = generate_token ()
103+ OAuth2RefreshToken .objects .create (
104+ user = current_user ,
105+ token = self .unencrypted_refresh_token ,
106+ application = obj .application ,
107+ access_token = obj ,
108+ )
103109 return obj
0 commit comments