Manchmal möchten Sie OAuth verwenden, um Ihr eigenes Dienstkonto mit einem externen Dienstkonto wie Facebook oder Twitter zu verknüpfen. Für Python3 können Sie mithilfe von python-social-auth problemlos einen Bildschirm zur Verknüpfung externer Konten für Webdienste hinzufügen. Wenn Sie jedoch dasselbe mit einer Smartphone-App tun möchten, müssen Sie eine Link-Funktion mit API bereitstellen, also ein Memo darüber, wie Sie damit umgehen sollen.
Dieses Mal übernehmen wir die Benutzerübernahmefunktion in der Smartphone-App. Die externen Dienste, die ich nutzen möchte, sind Facebook und Twitter. Die folgenden zwei Funktionen sind implementiert.
[Social Auth with Django REST Framework] (https://yeti.co/blog/social-auth-with-django-rest-framework/)
Python 3.4.3 Django 1.8
Der Ablauf der Authentifizierungsverarbeitung wird unter Verwendung von OAuth wie folgt angenommen.
Installation von Python-Social-Auth
python
$ pip install python-social-auth
Einstellungen für 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',
#Entfernen Sie den Benutzer, damit er beim Überprüfen der Anmeldeinformationen nicht erstellt wird
#'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"
Erstellen einer Tabelle für Anmeldeinformationen
python
$ ./manage.py migrate
Projektweite URL-Einstellungen
myproject/urls.py
from django.conf.urls import url
urlpatterns = [
...
url('', include('social.apps.django_app.urls', namespace='social'))
...
]
URL-Einstellung der App, für die Sie die Verknüpfungsfunktion verwenden möchten
myapp/urls.py
from django.conf.urls import url
from . import views
urlpatterns = [
# 1.API zum Verknüpfen eines externen Kontos mit einem bereits vorhandenen Benutzer
url(r'api/associate/(?P<backend>[^/]+)/$', views.associate_account, name='associate_account'),
# 2.API zum Abrufen verknüpfter Benutzerinformationen aus externen Kontoinformationen
url(r'api/auth/(?P<backend>[^/]+)/$', views.auth_account, name='auth_account'),
]
Ansicht der App, für die Sie die Verknüpfungsfunktion verwenden möchten
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 zum Verknüpfen eines externen Kontos mit einem bereits vorhandenen Benutzer
@api_view(('POST',))
@permission_classes((IsAuthenticated,))
@psa('social:complete')
def associate_account(request, backend):
backend = request.backend
token = _make_token(request, backend)
#Der Benutzer wird nur zurückgegeben, wenn die Authentifizierung mit OAuth erfolgreich ist
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 zum Abrufen verknüpfter Benutzerinformationen aus externen Kontoinformationen
@api_view(('POST',))
@psa('social:complete')
def auth_account(request, backend):
backend = request.backend
token = _make_token(request, backend)
#Der Benutzer wird nur zurückgegeben, wenn die Authentifizierung mit OAuth erfolgreich ist und diesen Informationen ein Benutzer zugeordnet ist.
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)
#Die Form des verwendeten Tokens unterscheidet sich zwischen OAuth1 und 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
Greifen Sie auf die URL (z. B. Http: // myserver / myapp / api / Associate / Twitter /) zu, wobei Associate_account mit einem Browser festgelegt wurde.
Geben Sie, wie im obigen Bildschirm gezeigt, access_token und access_token_secret im json-Format in den Inhalt ein und drücken Sie [POST].
{
"access_token": "my_access_token",
"access_token_secret": "my_access_token_secret"
}
Wenn "{" success ": true}" zurückgegeben wird, ist die Authentifizierung erfolgreich.
Greifen Sie mit einem Browser auf die URL zu (z. B. Http: // myserver / myapp / api / auth / twitter /), für die auth_account festgelegt wurde, und führen Sie das gleiche Verfahren wie im vorherigen Abschnitt aus.
Erfolg, wenn die ID des Benutzers, der zuvor verlinkt hat, zurückgegeben wird.
Dies kann fast nach dem gleichen Verfahren wie bei Twitter bestätigt werden, die folgenden beiden Punkte unterscheiden sich jedoch.
access_token_secret
)python-social-auth Praktisch! Ich konnte den für die Authentifizierung erforderlichen Code in nur wenigen Zeilen schreiben!
Diese Implementierung scheint jedoch endlich durch das Sammeln verschiedener verstreuter englischer Informationen realisiert worden zu sein, und ich hatte den Eindruck, dass Python nur wenige Informationen auf Japanisch hat.
Ich möchte mich mit Python 3.4 und Django 1.6.5-Today's Hack auf Twitter oder Facebook anmelden 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