使用 okta OAUTH 令牌身份验证的 Django Rest API

Django Rest API with okta OAUTH token authentication

我在使用 Okta 令牌身份验证时遇到问题,我知道如何使用 drf 令牌和 jwt 令牌身份验证进行身份验证。

在我的项目中,我也必须使用 okta 令牌,它也是一种 jwt,但是,这个令牌是由 front-end 生成并在请求中发回给我的

所以在这里您可以看到我如何使用 okta_jwt 包验证 okta 令牌:

def post(self, request, *args, **kwargs):

    access_token = request.META.get('HTTP_AUTHORIZATION')
    try:
        validate_token(access_token, config.issuer, config.aud, config.client_id)
    except Exception as e:
        return JsonResponse({"result": e.args[0]}, status=400)

    ..........

基本上我必须从 header 中取出令牌并使用 okta_jwt 检查它是否合法

显然,我认为这不是一个好的解决方案,而且很难进行单元测试

谁能为此提供更好的解决方案?

谢谢

我找到了解决方案:

我刚刚创建了继承自 BaseAuthentication 的自定义身份验证。在自定义身份验证中,您可以执行任何您想要的身份验证过程:

class OktaAuthentication(authentication.BaseAuthentication):

   def authenticate(self, request):
      access_token = request.META.get('HTTP_AUTHORIZATION')
      if not access_token:
        return None

    payload = validate_token(access_token, config.issuer, config.aud, config.client_id)

    try:
        user = get_user_model().objects.get(email=payload['sub'])

    except User.DoesNotExist:
        raise exceptions.AuthenticationFailed('No such user')

    return user, None

在 setting.py 中,确保将自定义身份验证添加为默认身份验证:

REST_FRAMEWORK = {
'DEFAULT_AUTHENTICATION_CLASSES': (
    'core.authentication.OktaAuthentication',
)}

在浏览量中:

authentication_classes = (OktaAuthentication,)
permission_classes = (IsAuthenticated,)