Django Rest API与okta OAUTH令牌认证。

问题描述 投票:0回答:1

我在使用Okta token认证时遇到了一个问题,我知道如何使用drf token和jwt token认证。

在我的项目中,我必须使用okta令牌,它也是jwt的一种,但是,这个令牌是由前端生成的,并在请求中发送给我。

所以在这里你可以看到我是如何用okta_jwt包来验证okta令牌的,基本上我必须从头中取出令牌,然后用okta_jwt检查它是否合法。

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)

    ..........

基本上,我必须从头中取出令牌 然后用okta_jwt检查它是否合法

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

谁能提供一个更好的解决方案?

谅谅

django authentication django-rest-framework jwt okta
1个回答
0
投票

我找到了解决方案。

我创建了一个继承自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',
)}

在views中:

authentication_classes = (OktaAuthentication,)
permission_classes = (IsAuthenticated,)
© www.soinside.com 2019 - 2024. All rights reserved.