Django Rest API с аутентификацией токена okta OAUTH - PullRequest
1 голос
/ 06 мая 2020

У меня проблема с аутентификацией токена Okta, я знаю, как аутентифицироваться с токеном drf и аутентификацией токена 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, законно ли это

Очевидно , Я не думаю, что это хорошее решение, и это сложно сделать модульный тест

Может ли кто-нибудь предложить лучшее решение для этого?

Спасибо

1 Ответ

0 голосов
/ 22 мая 2020

Я нашел решение:

Я только что создал настраиваемую аутентификацию, унаследованную от 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

В settings.py, убедитесь, что вы добавили пользовательскую аутентификацию в качестве значения по умолчанию:

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

В представлениях:

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