[PYTHON] Erstellen Sie mit Django eine API für die soziale Integration von Smartphone-Apps

Hintergrund

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.

Zweck

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.

  1. API zum Verknüpfen eines externen Kontos mit einem vorhandenen Django-Benutzer
  2. API zum Abrufen der zugehörigen Django-Benutzerinformationen aus den externen Kontoinformationen

[Social Auth with Django REST Framework] (https://yeti.co/blog/social-auth-with-django-rest-framework/)

Umgebung

Python 3.4.3 Django 1.8

Authentifizierungsablauf

Der Ablauf der Authentifizierungsverarbeitung wird unter Verwendung von OAuth wie folgt angenommen.

  1. Erhalten Sie ein OAuth-Token zur Authentifizierung mithilfe verschiedener SDKs in der Smartphone-App
  1. Senden Sie das in 1. von der Smartphone-App erhaltene OAuth-Token an Ihren Dienst
  1. Beziehen Sie eine Benutzer-ID von einem externen Dienst mithilfe des OAuth-Tokens, das Sie von Ihrem eigenen Dienst erhalten haben
  1. Wenn die Benutzer-ID in 3. abgerufen werden kann, führen Sie die erforderliche Verarbeitung durch (z. B. das Verknüpfen von Benutzerinformationen) und senden Sie das Verarbeitungsergebnis an die Smartphone-Anwendung zurück.

Implementierungsdetails

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

Funktionsprüfung

Zusammenarbeit mit Twitter

Vorbereitung

  1. Bereiten Sie access_token und access_token_secret (in gewisser Weise) für Benutzer vor, die mit Ihrer eigenen Twitter-App arbeiten.
  2. Melden Sie sich mit einem Browser beim Verwaltungsbildschirm Ihres eigenen Dienstes an.

So überprüfen Sie die externe Service-Verknüpfungsfunktion

Greifen Sie auf die URL (z. B. Http: // myserver / myapp / api / Associate / Twitter /) zu, wobei Associate_account mit einem Browser festgelegt wurde.

Django_REST_framework.png

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.

Django_REST_framework.png

So überprüfen Sie die externe Dienstauthentifizierungsfunktion

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.

Django_REST_framework.png

Für Facebook

Dies kann fast nach dem gleichen Verfahren wie bei Twitter bestätigt werden, die folgenden beiden Punkte unterscheiden sich jedoch.

  1. Ändern Sie im obigen Bestätigungsverfahren den Ort, an dem es sich um "Twitter" handelt, in "Facebook".
  2. Die einzigen zu sendenden JSON-Informationen sind "access_token". (OAuth2 hat kein access_token_secret)

Impressionen

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.

Referenz

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

Erstellen Sie mit Django eine API für die soziale Integration von Smartphone-Apps
Erstellen Sie mit Django ein Dashboard für Netzwerkgeräte!
Erstellen Sie eine API mit Django
Erstellen Sie eine Homepage mit Django
Erstellen Sie eine Web-API, die Bilder mit Django liefern kann
(Für Anfänger) Versuchen Sie, mit Django eine einfache Web-API zu erstellen
Erstellen Sie mit Django einen Datei-Uploader
[Python] Erstellen Sie mit Django einen Bildschirm für den HTTP-Statuscode 403/404/500
Erstellen Sie eine REST-API, um dynamodb mit dem Django REST Framework zu betreiben
Erstellen Sie ein Modell für Ihren Django-Zeitplan
Erstellen Sie mit Minette für Python einen LINE BOT
Erstellen Sie mit Django eine Hallo-Welt-Anwendung mit nur einer Datei
So erstellen Sie eine Rest-API in Django
Erstellen Sie eine saubere Datenbank zum Testen mit FastAPI und führen Sie Unittest of API mit pytest aus
Erstellen Sie einen Django-Zeitplan
Erstellen Sie eine Todo-App mit Django REST Framework + Angular
Lassen Sie uns eine Todo-App mit dem Django REST-Framework erstellen
Todo-App mit Django erstellen ③ Aufgabenlistenseite erstellen
Erstellen Sie eine Tweet-Heatmap mit der Google Maps-API
Erstellen Sie in Docker eine Ebene für AWS Lambda Python
Todo-App mit Django erstellen ⑤ Funktion zum Bearbeiten von Aufgaben erstellen
Erstellen Sie eine Django-Umgebung mit Docker-Compose (MariaDB + Nginx + uWSGI).
Erstellen einer Django-Umgebung für Win10 (mit virtuellem Speicherplatz)
Django-Anfänger erstellen einfache Apps 3
[Memo] Erstellen Sie mit Docker eine Entwicklungsumgebung für Django + Nuxt.js
Django-Anfänger erstellen einfache Apps 1
Empfehlung von Django, Bachstelze ~ Warum eine Website mit Python entwickeln ~
Erstellen Sie ein untergeordnetes Konto für die Verbindung mit Stripe in Python
[Django] Erstellen Sie ein Modell, das für Telefonnummer / Postleitzahl geeignet ist
Erstellen Sie einen Twitter-BOT mit dem GoogleAppEngine SDK für Python
Django-Anfänger erstellen einfache Apps 2
Erstellen Sie einen Django-Anmeldebildschirm
Tornado - Erstellen wir eine Web-API, die JSON problemlos mit JSON zurückgibt
Erstellen einer Todo-App mit Django ① Erstellen Sie eine Umgebung mit Docker
Erstellen Sie ein Verzeichnis mit Python
Qiita API Oauth mit Django
Django-Anfänger erstellen einfache Apps 5
Erstellen Sie mit der AWS-API einen Alias für Route53 zu CloudFront
Erstellen Sie eine temporäre Datei mit Django als Zip und geben Sie sie zurück
[Python / Django] Erstellen Sie eine Web-API, die im JSON-Format antwortet
Erstellen Sie eine gestreifte Illusion mit Gammakorrektur für Python3 und openCV3
Rails-Benutzer versuchen, mit Django eine einfache Blog-Engine zu erstellen
So erstellen Sie eine Bezeichnung (Maske) für die Segmentierung mit labelme (semantische Segmentierungsmaske)
[LINE Messaging API] Erstellen Sie einen BOT, der eine Verbindung zu jemandem mit Python herstellt
Erstellen Sie mit Vagrant (Ubuntu 16.04) eine Umgebung für Django x Apache x mod_wsgi.
Ich habe eine Entwicklungsumgebung für Django 3.0 mit Docker, Docker-Compose und Poetry erstellt
Versuchen Sie, einen Artikel von Qiita mit der REST-API [Umweltvorbereitung] zu erstellen.
Erstellen Sie ein USB-Boot-Ubuntu mit einer Python-Umgebung für die Datenanalyse
Erstellen Sie eine CP932-CSV-Datei für Excel mit Chalice und geben Sie sie zurück
So erstellen Sie mit AWS Lambda eine serverlose API für maschinelles Lernen
[DynamoDB] [Docker] Erstellen Sie mit Docker-Compose eine Entwicklungsumgebung für DynamoDB und Django
Richten Sie mit Django ein soziales Login ein
[AWS] API mit API Gateway + Lambda erstellen
Schritte zum Erstellen eines Django-Projekts
Stellen Sie die Django-Anwendung mit Docker bereit
Erstellen Sie eine virtuelle Umgebung mit Python!
Django-Tipps - Erstellen Sie eine Ranking-Site mit Django-
Erstellen Sie eine Webanwendung mit Django