Member 12731696 Ответов: 0

Как получить токен 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

0 Ответов