Django 我可以在一个站点中混合会话身份验证和令牌身份验证吗?

Django 我可以在一个站点中混合会话身份验证和令牌身份验证吗?,django,authentication,django-rest-framework,jwt,Django,Authentication,Django Rest Framework,Jwt,我有django应用程序使用会话身份验证。我需要添加API部分。此API将仅由my app.users(网络浏览器和手机设备)使用。我更愿意为API使用令牌身份验证,因为它看起来更健壮。我发现它可以处理它。 我的问题:我可以在一个站点中混合使用web会话身份验证和API令牌身份验证吗? 我认为web应用程序和API应用程序是两种不同的应用程序。所以我想在我的项目中将它们分开,使用不同的子域,并对每个子域使用不同的身份验证。是否可以按子域分隔身份验证?我想在用户登录到web应用时发送令牌。这是一个

我有django应用程序使用会话身份验证。我需要添加API部分。此API将仅由my app.users(网络浏览器和手机设备)使用。我更愿意为API使用令牌身份验证,因为它看起来更健壮。我发现它可以处理它。 我的问题:我可以在一个站点中混合使用web会话身份验证和API令牌身份验证吗? 我认为web应用程序和API应用程序是两种不同的应用程序。所以我想在我的项目中将它们分开,使用不同的子域,并对每个子域使用不同的身份验证。是否可以按子域分隔身份验证?我想在用户登录到web应用时发送令牌。这是一个好主意吗?

如中所示,您可以配置多个身份验证后端,而不会出现任何问题。DRF只需尝试每个后端,直到其中一个说“ok”

要记住一件事: 如果您(例如)提供了无效的JSON Web令牌,则身份验证将立即失败,并且不会尝试其他后端。很高兴在公园里看到你

  • return None
    表示后端说:“这不是JWT,让其他人试试。”
  • 引发异常。AuthenticationFailed(msg)
    的意思是:“用户尝试了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])