ΠΠ»ΡΡ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π΄Π»Ρ TokenAuthorization - Β«TokenΒ». Π§Π°ΡΠ΅ Π²ΡΠ΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ ΠΊΠ»ΡΡ Β«BearerΒ». ΠΠ΅ ΡΠ°ΠΊ Π΄Π°Π²Π½ΠΎ Ρ ΠΏΠΎΠΏΡΡΠ°Π»ΡΡ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΠΈΠΌΡ ΡΠΎΠΊΠ΅Π½Π° Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ Π΄Π»Ρ Π½Π°ΡΠ΅Π³ΠΎ REST-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ. Π― Π½Π°ΡΠ΅Π» ΠΊΠ»Π°ΡΡ TokenAuthentication Π² ΡΡΡΠΎΠΊΠ΅ 142 Π² authentication.py. ΠΠ½ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ ΠΌΠ΅ΡΠΎΠ΄ Β«authenticate_headerΒ», ΠΊΠΎΡΠΎΡΡΠΉ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ Β«TokenΒ», ΠΏΠΎΡΡΠΎΠΌΡ Ρ ΠΏΠΎΠ΄ΡΠΌΠ°Π», ΡΡΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΡΡΠΎΡ ΠΌΠ΅ΡΠΎΠ΄ ΠΈ Π²Π΅ΡΠ½ΡΡΡ Β«BearerΒ». ΠΠ΅Ρ, ΡΡΠΎ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ. ΠΠ½Π΅ ΠΏΡΠΈΡΠ»ΠΎΡΡ ΠΏΠ΅ΡΠ΅ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ Π²Π΅ΡΡ ΠΊΠ»Π°ΡΡ, ΡΡΠΎΠ±Ρ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΠΈΠΌΡ ΡΠΎΠΊΠ΅Π½Π°. Π― ΡΡΠΎ-ΡΠΎ ΡΠΏΡΡΡΠΈΠ»? ΠΠ° ΡΠ°ΠΌΠΎΠΌ Π΄Π΅Π»Π΅ ΡΡΠΎ Π΄ΠΎΠ»ΠΆΠ½ΠΎ Π±ΡΡΡ Π² ΡΠ°ΠΉΠ»Π΅ settings.py. Π― Π½Π΅ Π·Π½Π°Ρ, Π΅ΡΡΡ Π»ΠΈ Π΄ΡΡΠ³ΠΎΠΉ ΡΠΏΠΎΡΠΎΠ± ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΡΡ ΠΈΠΌΡ ΡΠΎΠΊΠ΅Π½Π°. ΠΡΠ»ΠΈ Π΅ΡΡΡ, Π΄Π°ΠΉΡΠ΅ ΡΡΡΠ»ΠΊΡ Π½Π° Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΡ. ΠΡΠ»ΠΈ ΡΡΠΎ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, Ρ ΠΌΠΎΠ³ Π±Ρ Π»Π΅Π³ΠΊΠΎ ΡΠΎΠ·Π΄Π°ΡΡ ΠΏΠ»Π°Π³ΠΈΠ½, ΠΊΠΎΡΠΎΡΡΠΉ Π±Π΅ΡΠ΅Ρ ΠΈΠΌΡ ΡΠΎΠΊΠ΅Π½Π° ΠΈΠ· ΡΠ°ΠΉΠ»Π° Π½Π°ΡΡΡΠΎΠ΅ΠΊ. ΠΠΎΡ ΠΎΠΆΠ΅, ΡΡΠΎ ΠΌΠ΅ΡΠΎΠ΄ Β«authenticate_headerΒ» Π²ΠΎΠΎΠ±ΡΠ΅ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΡΡΡ. ΠΡΠΎ ΠΌΠΎΡ ΠΌΠΎΠ΄ΠΈΡΠΈΠΊΠ°ΡΠΈΡ:
ΠΊΠ»Π°ΡΡ CustomTokenAuthentication (TokenAuthentication):
"" "ΠΠ·ΠΌΠ΅Π½ΠΈΡΠ΅ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ Π°Π²ΡΠΎΡΠΈΠ·Π°ΡΠΈΠΈ ΠΏΠΎ ΡΠΌΠΎΠ»ΡΠ°Π½ΠΈΡ Π½Π° Π±ΠΎΠ»Π΅Π΅ ΠΎΠ±ΡΠΈΠΉ" Bearer ".
"" "
header_key = Π½ΠΎΡΠΈΡΠ΅Π»Ρ '
def authenticate(self, request):
auth = get_authorization_header(request).split()
if not auth or auth[0].lower() != self.header_key:
return None
if len(auth) == 1:
msg = _('Invalid token header. No credentials provided.')
raise exceptions.AuthenticationFailed(msg)
elif len(auth) > 2:
msg = _(
'Invalid token header. Token string should not contain spaces.'
)
raise exceptions.AuthenticationFailed(msg)
try:
token = auth[1].decode()
except UnicodeError:
msg = _(
'Invalid token header. Token string should not contain',
'invalid characters.'
)
raise exceptions.AuthenticationFailed(msg)
return self.authenticate_credentials(token)
def authenticate_header(self, request):
return "Bearer"
ΠΠ°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ΅Ρ, ΡΠ»Π΅Π΄ΡΠ΅Ρ Π»ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΎΡΠ²Π΅Ρ 401
ΠΈ Π΅ΡΠ»ΠΈ Π΄Π°, ΡΠΎ ΠΊΠ°ΠΊΠΎΠ΅ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ Π΄ΠΎΠ»ΠΆΠ΅Π½ ΠΈΠΌΠ΅ΡΡ Π·Π°Π³ΠΎΠ»ΠΎΠ²ΠΎΠΊ WWW-Authenticate
.
ΠΡΠ»ΠΈ Π²Ρ Ρ ΠΎΡΠΈΡΠ΅ ΠΈΠ·ΠΌΠ΅Π½ΠΈΡΡ ΠΏΠΎΠ²Π΅Π΄Π΅Π½ΠΈΠ΅ Π°ΡΡΠ΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΈ ΡΠΎΠΊΠ΅Π½Π°, Π²Π°ΠΌ ΠΏΡΠΎΡΡΠΎ Π½ΡΠΆΠ½ΠΎ ΡΠ΄Π΅Π»Π°ΡΡ ΡΡΠΎ ΡΠ²Π½ΠΎ.
Π― ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠΎ ΡΡΠΎΠ»ΠΊΠ½ΡΠ»ΡΡ Ρ ΡΠΎΠΉ ΠΆΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΠΉ.
@tomchristie, Π½Π΅ ΠΏΡΠ»-ΡΠ΅ΠΊΠ²Π΅ΡΡ , ΠΊΠΎΡΠΎΡΡΠΉ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΠ» Π±Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΊΠ»Π°ΡΡΠ° keyword
Π² 'Token'
Π² TokenAuthorization
ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈ Π±Ρ Π΅Π³ΠΎ Π²Π½ΡΡΡΠΈ ΡΠ²ΠΎΠΈΡ
ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² (Π²ΠΌΠ΅ΡΡΠΎ ΠΆΠ΅ΡΡΠΊΠΎΠ³ΠΎ ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½ΠΈΡ, ΠΊΠ°ΠΊ ΡΡΠΎ Π΄Π΅Π»Π°Π΅ΡΡΡ ΡΠ΅ΠΉΡΠ°Ρ), ΠΏΠΎΡΡΠΎΠΌΡ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ΄Π΅Π»Π°ΡΡ:
class BearerAuthentication(authentication.TokenAuthentication):
'''
Simple token based authentication using utvsapitoken.
Clients should authenticate by passing the token key in the 'Authorization'
HTTP header, prepended with the string 'Bearer '. For example:
Authorization: Bearer 956e252a-513c-48c5-92dd-bfddc364e812
'''
keyword = 'Bearer'
?
Π‘ΠΎΠ·Π΄Π°Π½ΠΎ Π² https://github.com/tomchristie/django-rest-framework/pull/4097
Π‘Π°ΠΌΡΠΉ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ
Π― ΡΠΎΠ»ΡΠΊΠΎ ΡΡΠΎ ΡΡΠΎΠ»ΠΊΠ½ΡΠ»ΡΡ Ρ ΡΠΎΠΉ ΠΆΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΎΠΉ.
@tomchristie, Π½Π΅ ΠΏΡΠ»-ΡΠ΅ΠΊΠ²Π΅ΡΡ , ΠΊΠΎΡΠΎΡΡΠΉ ΡΡΡΠ°Π½ΠΎΠ²ΠΈΠ» Π±Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ ΠΊΠ»Π°ΡΡΠ°
keyword
Π²'Token'
Π²TokenAuthorization
ΠΈ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»ΠΈ Π±Ρ Π΅Π³ΠΎ Π²Π½ΡΡΡΠΈ ΡΠ²ΠΎΠΈΡ ΠΌΠ΅ΡΠΎΠ΄ΠΎΠ² (Π²ΠΌΠ΅ΡΡΠΎ ΠΆΠ΅ΡΡΠΊΠΎΠ³ΠΎ ΠΊΠΎΠ΄ΠΈΡΠΎΠ²Π°Π½ΠΈΡ, ΠΊΠ°ΠΊ ΡΡΠΎ Π΄Π΅Π»Π°Π΅ΡΡΡ ΡΠ΅ΠΉΡΠ°Ρ), ΠΏΠΎΡΡΠΎΠΌΡ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ΄Π΅Π»Π°ΡΡ:?