我有使用session auth的django应用程序。我需要添加API部分。此API仅供我的app.users使用(网络浏览器和移动设备)。我更喜欢使用令牌身份验证API,因为它似乎更健壮。我发现rest_framework_jwt可以处理它。 我的问题:我可以在一个站点中混合会话auth for web和token auth for API吗? 我认为Web应用程序和API应用程序是两个不同的应用程序。所以我想在我的项目中将它们分开,使用不同的子域并为每个子域使用不同类型的auth。是否可以通过子域分隔auth?我想在用户登录Web应用程序时发送令牌。这是好主意吗?
答案 0 :(得分:3)
正如您在documentation中看到的那样,您可以配置多个身份验证后端而不会出现任何问题。 DRF将尝试每个后端,直到一个人说“ok”。
要记住一件事: 如果您(例如)提供无效的JSON-Web-Token,则身份验证将立即失败,并且不会尝试其他后端。很高兴看到source of rest_framework_jwt。
def authenticate(self, request):
"""
Returns a two-tuple of `User` and token if a valid signature has been
supplied using JWT-based authentication. Otherwise returns `None`.
"""
auth = get_authorization_header(request).split()
if not auth or auth[0].lower() != b'jwt':
return None
if len(auth) == 1:
msg = 'Invalid JWT header. No credentials provided.'
raise exceptions.AuthenticationFailed(msg)
elif len(auth) > 2:
msg = ('Invalid JWT header. Credentials string '
'should not contain spaces.')
raise exceptions.AuthenticationFailed(msg)
try:
payload = jwt_decode_handler(auth[1])
except jwt.ExpiredSignature:
msg = 'Signature has expired.'
raise exceptions.AuthenticationFailed(msg)
except jwt.DecodeError:
msg = 'Error decoding signature.'
raise exceptions.AuthenticationFailed(msg)
user = self.authenticate_credentials(payload)
return (user, auth[1])
return None
表示后端说:“这不是JWT,让其他人试试raise exceptions.AuthenticationFailed(msg)
表示:“用户尝试过JWT,但他失败了。” 回答进一步的问题:
View
或ViewSet
覆盖它们。