带有 okta OAUTH 令牌身份验证的 Django Rest API
Posted
技术标签:
【中文标题】带有 okta OAUTH 令牌身份验证的 Django Rest API【英文标题】:Django Rest API with okta OAUTH token authentication 【发布时间】:2020-08-21 20:34:05 【问题描述】:我在使用 Okta 令牌身份验证时遇到问题,我知道如何使用 drf 令牌和 jwt 令牌身份验证进行身份验证。
在我的项目中,我必须使用 okta 令牌,它也是一种 jwt,但是,此令牌是由前端生成并在请求中发送回给我
所以在这里您可以看到我如何使用 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)
..........
基本上我必须从标头中取出令牌并与 okta_jwt 检查它是否合法
显然,我认为这不是一个好的解决方案,而且很难进行单元测试
谁能为此提供更好的解决方案?
谢谢
【问题讨论】:
【参考方案1】:我找到了解决办法:
我刚刚创建了继承自 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,)
【讨论】:
以上是关于带有 okta OAUTH 令牌身份验证的 Django Rest API的主要内容,如果未能解决你的问题,请参考以下文章