带有 okta OAUTH token 身份验证的 Django Rest API

标签 django authentication django-rest-framework jwt okta

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

在我的项目中,我也必须使用 okta token ,它也是一种 jwt,但是,此 token 由前端生成并在请求中发回给我

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

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 中取出 token 并使用 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',
)}

在 View 中:

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

关于带有 okta OAUTH token 身份验证的 Django Rest API,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61642674/

相关文章:

python - tasty pie - 返回带有非 ORM 对象的 JSON

python - Django 中的同步 AJAX 请求和 MySQL 数据库数据可见性

django - 使用 GeoDjango 将 geojson 文件中的多边形数据导入 PostGIS

authentication - OpenID Connect,如果尚未登录,则无需登录表单即可重定向?

java - org.apache.http.client.ClientProtocolException异常

python - __init__() 在 Django Rest Framework 中使用 get 调用时得到一个意外的关键字参数 'context'

python - django-rest-auth 注册/验证电子邮件/不工作

.net - VS 2008 单元测试的 WCF 安全错误

python - Django 用户密码未针对自定义用户进行哈希处理

django - 如何使用 Django REST Framework 将 TextField 作为文字 JSON 提供服务而不转义?