La clave predeterminada para TokenAuthorization es "Token". La clave más utilizada es "Portador". No hace mucho intenté cambiar el nombre del token de autenticación para nuestra aplicación REST. Encontré la clase TokenAuthentication en la línea 142 en authentication.py. Define el método "authenticate_header" que devuelve "Token", así que pensé que es posible anular este método y devolver "Bearer". No, no es posible. Tuve que anular toda la clase solo para cambiar el nombre del token. ¿Me he perdido algo? Esto debería estar en el archivo settings.py. No sé si hay otra forma de definir el nombre del token. Si lo hay, por favor, dame un enlace a los documentos. Si no es posible, podría crear fácilmente un complemento que tome el nombre del token del archivo de configuración. El método "authenticate_header" parece no utilizarse en absoluto. Esta es mi modificación:
clase CustomTokenAuthentication (TokenAuthentication):
"" "Modificar el encabezado de autorización predeterminado a un 'Portador' mucho más común.
"" "
header_key = b'bearer '
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"
El encabezado de autenticación determina si se debe usar una respuesta 401
y, de ser así, qué valor debe tener el encabezado WWW-Authenticate
.
Si desea cambiar el comportamiento de la autenticación del token, solo tendrá que hacerlo explícitamente.
Acabo de encontrarme con el mismo problema.
@tomchristie , ¿aceptaría una solicitud de extracción que establecería keyword
variable de clase en 'Token'
en TokenAuthorization
, y la usaría dentro de sus métodos (en lugar de codificarla, como se hace ahora), entonces podemos hacer:
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'
?
Comentario más útil
Acabo de encontrarme con el mismo problema.
@tomchristie , ¿aceptaría una solicitud de extracción que establecería
keyword
variable de clase en'Token'
enTokenAuthorization
, y la usaría dentro de sus métodos (en lugar de codificarla, como se hace ahora), entonces podemos hacer:?