私は自分のウェブサイトでソーシャルログインにDjango-allauthを使用しています。また、モバイルアプリのバックエンドとして機能するDjango-rest-frameworkを利用したREST APIも用意しています。 allauthの認証バックエンドをREST APIに直接接続して、モバイルアプリでFacebookログインを使用するユーザーを検証(および登録)できる方法はありますか?
明確にするために:Facebookログイン部分はネイティブSDKによって処理されます。 POST /user
のように機能する(つまり、新しいユーザーを作成する)エンドポイントが必要ですが、電子メール/パスワードなどの代わりにFacebook oauthトークンを入力として受け取ります。
このlibrayをソーシャル認証に使用できます Django-rest-framework-social-oauth2 。このDjango-allauth関連のコードを試してください
urlpatterns = [
url(
r'^rest/facebook-login/$',
csrf_exempt(RestFacebookLogin.as_view()),
name='rest-facebook-login'
),
]
class EverybodyCanAuthentication(SessionAuthentication):
def authenticate(self, request):
return None
class RestFacebookLogin(APIView):
"""
Login or register a user based on an authentication token coming
from Facebook.
Returns user data including session id.
"""
# this is a public api!!!
permission_classes = (AllowAny,)
authentication_classes = (EverybodyCanAuthentication,)
def dispatch(self, *args, **kwargs):
return super(RestFacebookLogin, self).dispatch(*args, **kwargs)
def get(self, request, *args, **kwargs):
try:
original_request = request._request
auth_token = request.GET.get('auth_token', '')
# Find the token matching the passed Auth token
app = SocialApp.objects.get(provider='facebook')
fb_auth_token = SocialToken(app=app, token=auth_token)
# check token against facebook
login = fb_complete_login(original_request, app, fb_auth_token)
login.token = fb_auth_token
login.state = SocialLogin.state_from_request(original_request)
# add or update the user into users table
complete_social_login(original_request, login)
# Create or fetch the session id for this user
token, _ = Token.objects.get_or_create(user=original_request.user)
# if we get here we've succeeded
data = {
'username': original_request.user.username,
'objectId': original_request.user.pk,
'firstName': original_request.user.first_name,
'lastName': original_request.user.last_name,
'sessionToken': token.key,
'email': original_request.user.email,
}
return Response(
status=200,
data=data
)
except:
return Response(status=401, data={
'detail': 'Bad Access Token',
})
Django-allauthに依存する Django Rest Auth を使用できます。統合は非常に簡単です。
Allauthとrest-fremeworkを一緒に使用する方法はよくわかりませんが、 allauthはそのようなエンドポイントを提供しません 。
提案:次のバリエーションを実行する独自のものを作成します。
allauth.socialaccount.providers.facebook.views.fb_complete_login(None、socialtoken)を呼び出します。ここで、socialtokenはlogin_by_tokenで作成したとおりです。これはDjango.contrib.auth.loginを(いくつかの機能をより深く)実行し、おそらくアカウントを作成します。
その後、モバイルデバイスで使用するために、認証(FBではなく)トークンが可能になる場合があります。(セッションから)ユーザーデータを取得し、rest_framework.authtoken.views.obtain_auth_tokenを呼び出します。
ノート:
1。これは、メールの競合を解決したり、ソーシャル/ローカルアカウントを接続する方法を提供しません。
2。まだ試していません-動作するようになったらコードを投稿してください。
Djoserを使用することもできますが、それがallauthとどのように連携するかわかりません。 https://github.com/sunscrapers/djoser