11from django .contrib .auth import get_user_model
22from django .core import signing
3+ from django .core .signing import SignatureExpired
34from django .utils import baseconv
45
56__all__ = (
@@ -52,13 +53,14 @@ def _make_hash_value(self, user):
5253 user_pk = baseconv .base62 .encode (user .pk )
5354 return self .sep .join ((user_pk , last_login ))
5455
55- def unsign (self , value , max_age = None ):
56+ def unsign (self , value , max_age = None , allow_multi_use = False ):
5657 """
5758 Verify access token and return user, if the token is valid.
5859
5960 Args:
6061 value (str): URL safe base64 encoded access token.
6162 max_age (datetime.timedelta): Maximum age an access token to be valid.
63+ allow_multi_use: If True allows the token to be used more than once
6264
6365 Returns:
6466 django.contrib.user.models.BaseUser: Return user object for given
@@ -85,7 +87,10 @@ def unsign(self, value, max_age=None):
8587 raise UserDoesNotExist ("User with pk=%s does not exist" % user_pk ) from e
8688 else :
8789 if last_login != '' and self .to_timestamp (user .last_login ) != last_login :
88- raise signing .SignatureExpired (
89- "The access token for %r seems used" % user
90- )
90+ if allow_multi_use :
91+ return user
92+ else :
93+ raise SignatureExpired (
94+ "The access token for %r seems used" % user
95+ )
9196 return user
0 commit comments