Логин Apple в среде django rest с использованием allauth и rest-auth

#django #django-rest-framework #django-allauth #django-rest-auth

#django #django-rest-framework #django-allauth #django-rest-auth

Вопрос:

Я реализовал логин Apple в django с использованием allauth и rest-auth. Я реализовал так же, как и Google login, который работал отлично.

views.py

 class AppleLogin(SocialLoginView):
    adapter_class = AppleOAuth2Adapter
  

urls.py

 urlpatterns = [
    path("auth/apple/", AppleLogin.as_view(), name="apple-login"),
]
  

версии pip

 Django==2.2.17
django-allauth==0.43.0
django-rest-auth==0.9.3
djangorestframework==3.8.2
djangorestframework-jwt==1.11.0
  

Когда я тестирую, как показано ниже, я получаю KeyError: 'id_token' , и вот откуда возникает ошибка: https://github.com/pennersr/django-allauth/blob/master/allauth/socialaccount/providers/apple/views.py#L92

Я понятия не имею, как исправить эту ошибку.

Спасибо за вашу помощь!

 curl -X POST 'https://.../auth/apple/' 
              -d 'access_token=AUTHENTICATION_CODE'

or

curl -X POST 'https://.../auth/apple/' 
              -d 'id_token=ID_TOKEN'   
              -d 'access_token=AUTHENTICATION_CODE'
  

Ответ №1:

Используйте этот пользовательский serializerClass. https://github.com/pennersr/django-allauth/pull/2424#issuecomment-651913243

Похоже, что проблема в django-rest-auth, ваше представление аутентификации должно выглядеть следующим образом

 from allauth.socialaccount.providers.apple.views import AppleOAuth2Adapter
from allauth.socialaccount.providers.apple.client import AppleOAuth2Client
from rest_auth.registration.views import SocialLoginView

class AppleLogin(SocialLoginView):
    adapter_class = AppleOAuth2Adapter
    callback_url = 'https://anycallbackurlhere'
    client_class = AppleOAuth2Client
    serializer_class = CustomAppleSocialLoginSerializer
  

Единственное изменение в SerializerClass находится в validate функции, поэтому вы можете просто переопределить этот метод

 from rest_auth.registration.serializers import SocialLoginSerializer

class CustomAppleSocialLoginSerializer(SocialLoginSerializer):
    def validate(self, attrs):
        .... #copy the method from the link above
  

Комментарии:

1. @Ben и @Jonabc7 здравствуйте, я прошел через этот метод, но я получаю сообщение об ошибке от allauth.socialaccount.providers. Apple.views импортирует AppleOAuth2Adapter ModuleNotFoundError: нет модуля с именем ‘allauth.socialaccount.providers. Apple»

2. @Kwall Вам необходимо обновить django-allauth до версии 0.43.0 или выше. Поставщик Apple был добавлен в версии 0.43.0. Вы можете ознакомиться с примечаниями к выпуску здесь: django-allauth.readthedocs.io/en/latest/release-notes.html#id2

3. @Ben Да, теперь это работает, большое вам спасибо

4. Я пробовал то же самое, но не перенаправлялся на callback_url.