Il y a des moments où vous souhaitez utiliser OAuth pour lier votre propre compte de service à un compte de service externe tel que Facebook ou Twitter. Pour Python3, vous pouvez facilement ajouter un écran de liaison de compte externe pour les services Web en utilisant python-social-auth. Cependant, si vous souhaitez faire de même avec une application pour smartphone, vous devez fournir une fonction de lien avec l'API, donc une note sur la façon de la gérer.
Cette fois, nous assumons la fonction de prise de contrôle de l'utilisateur dans l'application pour smartphone. Les services externes que je souhaite utiliser sont Facebook et Twitter. Les deux fonctions suivantes sont implémentées.
[Social Auth with Django REST Framework] (https://yeti.co/blog/social-auth-with-django-rest-framework/)
Python 3.4.3 Django 1.8
Le flux de traitement d'authentification est supposé être le suivant en utilisant OAuth.
Installation de python-social-auth
python
$ pip install python-social-auth
Paramètres de python-social-auth
settings.py
INSTALLED_APPS = (
...
'social.apps.django_app.default',
...
)
TEMPLATE_CONTEXT_PROCESSORS = (
...
'social.apps.django_app.context_processors.backends',
'social.apps.django_app.context_processors.login_redirect',
...
)
AUTHENTICATION_BACKENDS = (
'social.backends.facebook.FacebookOAuth2',
'social.backends.twitter.TwitterOAuth',
'django.contrib.auth.backends.ModelBackend',
)
SOCIAL_AUTH_PIPELINE = (
'social.pipeline.social_auth.social_details',
'social.pipeline.social_auth.social_uid',
'social.pipeline.social_auth.auth_allowed',
'social.pipeline.social_auth.social_user',
#Supprimez l'utilisateur afin qu'il ne soit pas créé lors de la vérification des informations d'identification
#'social.pipeline.user.create_user',
'social.pipeline.social_auth.associate_user',
'social.pipeline.social_auth.load_extra_data',
'social.pipeline.user.user_details',
)
SOCIAL_AUTH_TWITTER_KEY = "MY_TWITTER_APP_KEY "
SOCIAL_AUTH_TWITTER_SECRET = "MY_TWITTER_APP_SECRET"
SOCIAL_AUTH_FACEBOOK_KEY = "MY_FACEBOOK_APP_ID"
SOCIAL_AUTH_FACEBOOK_SECRET = "MY_FACEBOOK_APP_SECRET"
Créer une table pour les informations d'identification
python
$ ./manage.py migrate
Paramètres d'URL à l'échelle du projet
myproject/urls.py
from django.conf.urls import url
urlpatterns = [
...
url('', include('social.apps.django_app.urls', namespace='social'))
...
]
Paramètre d'URL de l'application pour laquelle vous souhaitez utiliser la fonction de liaison
myapp/urls.py
from django.conf.urls import url
from . import views
urlpatterns = [
# 1.API pour lier un compte externe à un utilisateur qui existe déjà
url(r'api/associate/(?P<backend>[^/]+)/$', views.associate_account, name='associate_account'),
# 2.API pour obtenir des informations utilisateur liées à partir d'informations de compte externe
url(r'api/auth/(?P<backend>[^/]+)/$', views.auth_account, name='auth_account'),
]
Vue de l'application pour laquelle vous souhaitez utiliser la fonction de liaison
myapp/views.py
from django.contrib.auth import login
from rest_framework import status
from rest_framework.response import Response
from rest_framework.permissions import IsAuthenticated
from rest_framework.decorators import api_view, permission_classes
from social.backends.oauth import BaseOAuth1, BaseOAuth2
from social.apps.django_app.utils import psa
# 1.API pour lier un compte externe à un utilisateur qui existe déjà
@api_view(('POST',))
@permission_classes((IsAuthenticated,))
@psa('social:complete')
def associate_account(request, backend):
backend = request.backend
token = _make_token(request, backend)
#L'utilisateur est renvoyé uniquement lorsque l'authentification avec OAuth est réussie
user = backend.do_auth(token, user=request.user)
if user:
login(request, user)
return Response({'success': True})
else:
return Response({"errors": "Error with social authentication"},
status=status.HTTP_400_BAD_REQUEST)
# 2.API pour obtenir des informations utilisateur liées à partir d'informations de compte externe
@api_view(('POST',))
@psa('social:complete')
def auth_account(request, backend):
backend = request.backend
token = _make_token(request, backend)
#L'utilisateur est renvoyé uniquement lorsque l'authentification avec OAuth est réussie et qu'un utilisateur est associé à ces informations.
user = backend.do_auth(token)
if user:
return Response({'id': user.id, 'username': user.username})
else:
return Response({"errors": "User Not Found"},
status=status.HTTP_404_NOT_FOUND)
#La forme du jeton utilisé est différente entre OAuth1 et OAuth2
def _make_token(request, backend):
if isinstance(backend, BaseOAuth1):
token = {
'oauth_token': request.data.get('access_token'),
'oauth_token_secret': request.data.get('access_token_secret'),
}
elif isinstance(backend, BaseOAuth2):
token = request.data.get('access_token')
return token
Accédez à l'URL (ex. Http: // myserver / myapp / api / associé / twitter /) avec associé_account défini avec un navigateur.
Comme indiqué dans l'écran ci-dessus, entrez access_token et access_token_secret au format json dans le contenu, puis appuyez sur [POST].
{
"access_token": "my_access_token",
"access_token_secret": "my_access_token_secret"
}
Si {" success ": true}
est renvoyé, l'authentification est réussie.
Accédez à l'URL (ex. Http: // myserver / myapp / api / auth / twitter /) pour laquelle auth_account est défini avec un navigateur, et effectuez la même procédure que dans la section précédente.
Succès si l'ID de l'utilisateur qui s'est lié précédemment est renvoyé
Cela peut être confirmé par presque la même procédure que Twitter, mais les deux points suivants sont différents.
. (OAuth2 n'a pas ʻaccess_token_secret
)python-social-auth Pratique! J'ai pu écrire le code requis pour l'authentification en quelques lignes seulement!
Cependant, cette implémentation semble avoir finalement été réalisée en rassemblant diverses informations anglaises dispersées, et j'ai eu l'impression que Python a peu d'informations en japonais.
Je veux me connecter sur Twitter ou Facebook avec Python 3.4 et Django 1.6.5-Today's Hack http://narusemotoki.tumblr.com/post/90525892180/python-34%E3%81%A8django-165%E3%81%A7twitter%E3%82%84facebook%E3%81%A7%E3%81%AE%E3%83%AD%E3%82%B0%E3%82%A4%E3%83%B3%E3%82%92%E3%81%97%E3%81%9F%E3%81%84
omab/python-social-auth https://github.com/omab/python-social-auth
Django Framework — Python Social Auth documentation https://python-social-auth.readthedocs.org/en/latest/configuration/django.html
Pipeline — Python Social Auth documentation https://python-social-auth.readthedocs.org/en/latest/pipeline.html#authentication-pipeline
Use Cases — Python Social Auth documentation http://psa.matiasaguirre.net/docs/use_cases.html#signup-by-oauth-access-token
Twitter OAuth using access_token · Issue #272 · omab/python-social-auth https://github.com/omab/python-social-auth/issues/272
Social Auth with Django REST Framework - Yeti https://yeti.co/blog/social-auth-with-django-rest-framework/
Recommended Posts