Как получить токен django rest framework после goolge oauth с помощью social_django?
Привет
Что я делаю :
Я пытаюсь использовать кнопку google sign in, чтобы получить tokenId и отправить его в django rest api, где он может проверить с помощью Google api и создать нового пользователя из полученной электронной почты (если пользователь не зарегистрирован по идентификатору электронной почты) и ответить с помощью токена по умолчанию (Django Rest Framework) на Android-клиент, чтобы он мог в дальнейшем использоваться для выполнения некоторых операций CRUD для DRF
Как у меня дела :
1. Я создал две учетные данные для приложения для Android и другие веб-приложения
2. Добавлен отпечаток пальца SHA-1 в учетные данные Android, скопировав его из gradle signingReport Android studio (без предоставления SHA-1 в учетные данные вы не получите желаемый idToken )
Что я уже пробовал:
3. Затем я вручную становится значение tokenid
private void handleSignInResult(Task<GoogleSignInAccount> completedTask) { try { GoogleSignInAccount account = completedTask.getResult(ApiException.class); // Signed in successfully, show authenticated UI. updateUI(account); } catch (ApiException e) { // The ApiException status code indicates the detailed failure reason. // Please refer to the GoogleSignInStatusCodes class reference for more information. Log.w(this.getLocalClassName(), "signInResult:failed code=" + e.getStatusCode()); updateUI(null); } } private void updateUI(GoogleSignInAccount account){ Toast.makeText(this,"SUCCESS",Toast.LENGTH_SHORT).show(); Log.w(this.getLocalClassName(), "updateUI:::SUCCESS" + " \nID TOKEN : "+account.getIdToken()+" \nEMAIL : "+account.getEmail()+" \nNAME : "+account.getDisplayName()); }
4. Затем я последовал этому toptal ссылке ниже, чтобы создать API в Django, где я могу разместить мои сведения об идентификаторе маркера, проверить его с помощью Google и если пользователь существует, то ответить с проверкой подлинности ФПИ маркер (если пользователь не существует, то создать новый и реагировать с авт ФПИ маркер )
Интегрируйте OAuth 2 в ваш сервер Django/DRF Back-end | Toptal[^]
5. мой код Django выглядит следующим образом :
urls.py
re_path(r'^authenticate/(?P<backend>[^/]+)/$',views.exchange_token,name='url_authenticate'),
settings.py
print(SECRET_KEY) DEBUG = env('DEBUG') ALLOWED_HOSTS = [] INSTALLED_APPS = [ 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', 'api', 'rest_framework', 'rest_framework.authtoken', 'social_django', ] MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware', 'social_django.middleware.SocialAuthExceptionMiddleware', ] ROOT_URLCONF = 'bitconnect_proj.urls' TEMPLATES = [ { 'BACKEND': 'django.template.backends.django.DjangoTemplates', 'DIRS': [], 'APP_DIRS': True, 'OPTIONS': { 'context_processors': [ 'django.template.context_processors.debug', 'django.template.context_processors.request', 'django.contrib.auth.context_processors.auth', 'django.contrib.messages.context_processors.messages', 'social_django.context_processors.backends', 'social_django.context_processors.login_redirect', ], }, }, ] TEMPLATE_CONTEXT_PROCESSORS = ( 'social_django.context_processors.backends', 'social_django.context_processors.login_redirect', ) REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': ( 'rest_framework.permissions.IsAuthenticated', ), 'DEFAULT_AUTHENTICATION_CLASSES': ( 'rest_framework.authentication.TokenAuthentication', ), } AUTHENTICATION_BACKENDS = ( 'social_core.backends.google.GoogleOAuth2', 'django.contrib.auth.backends.ModelBackend', ) SOCIAL_AUTH_GOOGLE_OAUTH2_KEY = env('SOCIAL_AUTH_GOOGLE_OAUTH2_KEY') SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET = env('SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET') SOCIAL_AUTH_GOOGLE_OAUTH2_SCOPE = [ 'https://www.googleapis.com/auth/userinfo.email', 'https://www.googleapis.com/auth/userinfo.profile', ] SOCIAL_AUTH_ADMIN_USER_SEARCH_FIELDS = ['username', 'first_name', 'email'] SOCIAL_AUTH_USERNAME_IS_FULL_EMAIL = True SOCIAL_AUTH_PIPELINE = ( 'social_core.pipeline.social_auth.social_details', 'social_core.pipeline.social_auth.social_uid', 'social_core.pipeline.social_auth.auth_allowed', 'social_core.pipeline.social_auth.social_user', 'social_core.pipeline.user.get_username', 'social_core.pipeline.social_auth.associate_by_email', 'social_core.pipeline.user.create_user', 'social_core.pipeline.social_auth.associate_user', 'social_core.pipeline.social_auth.load_extra_data', 'social_core.pipeline.user.user_details', ) WSGI_APPLICATION = 'bitconnect_proj.wsgi.application' DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': BASE_DIR / 'db.sqlite3', } } AUTH_PASSWORD_VALIDATORS = [ { 'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator', }, { 'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator', }, { 'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator', }, { 'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator', }, ] LANGUAGE_CODE = 'en-us' TIME_ZONE = 'UTC' USE_I18N = True USE_L10N = True USE_TZ = True STATIC_URL = '/static/'
views.py
from django.shortcuts import render from rest_framework.decorators import api_view, permission_classes from rest_framework.permissions import AllowAny from rest_framework.authtoken.models import Token from rest_framework.response import Response from social_django.utils import psa from rest_framework import serializers,status # Create your views here. class AuthSerializer(serializers.Serializer): access_token = serializers.CharField(allow_blank=False,trim_whitespace=True,) @api_view(http_method_names=['POST']) @permission_classes([AllowAny]) @psa() def exchange_token(request,backend): backend = request.strategy print("BACKEND:::",backend) serializer = AuthSerializer(data=request.data) if serializer.is_valid(raise_exception=True): print("HERE........0") # This is the key line of code: with the @psa() decorator above, # it engages the PSA machinery to perform whatever social authentication # steps are configured in your SOCIAL_AUTH_PIPELINE. At the end, it either # hands you a populated User model of whatever type you've configured in # your project, or None. user = request.backend.do_auth(serializer.validated_data['access_token']) print("HERE......") if user: # if using some other token backend than DRF's built-in TokenAuthentication, # you'll need to customize this to get an appropriate token object token, _ = Token.objects.get_or_create(user=user) return Response({'token': token.key}) else: print("HERE .............NO USER EXISTS") return Response( {'errors': {'token': 'Invalid token'}}, status=status.HTTP_400_BAD_REQUEST, )
6. Когда я делаю POST-запрос на выше конечной точки , я получаю эту ошибку :
"/home/thebitshoes/Desktop/Environments/voiceconnect_new/lib/python3.8/site-packages/social_core/utils.py",
строка 256, в обертке
поднять AuthForbidden(args[0])
Тип исключения: AuthForbidden at /authenticate/google-oauth2/
Значение исключения: ваши учетные данные не разрешены
Я хочу опубликовать idToken с Android (после получения его из операции входа) на свой сервер Django и получить токен, который является токеном DRF, чтобы я мог использовать API в качестве авторизованного пользователя приложения DJango
Заранее спасибо !!
Sandeep Mewara
Взгляните на это: https://www.gitmemory.com/issue/python-social-auth/social-app-django/202/499176896
Member 12731696
Привет Сандип ,
Я делаю post-запрос на свой сервер django, где он принимает только access_token