フロントエンドでSatellizerをクライアントとして使用し、 django rest frameworkを使用してバックエンドでpython social authを使用して、単一ページの角度アプリで認証を有効にしようとしています。主な問題は、セッション認証の代わりにJWTを使用したいということです。
social/complete/backend
ユーザーがポップアップ ウィンドウを(python social auth view)に確認した後に取得した応答を渡そうとしましたが、うまくいきませんでした。
Google 構成の satellizer に次のように記述しました。
$authProvider.google({
clientId:'609163425136-1i7b7jlr4j4hlqtnb1gk3al2kagavcjm.apps.googleusercontent.com',
url: 'social/complete/google-oauth2/',
optionalUrlParams: ['display', 'state'],
state: function() {
return Math.random();
}
});
私が遭遇する問題は、python social authにあります:
必要なパラメーターの状態がありません
google- oauth2 および
必要なパラメーターコードがありません
フェイスブック用。
これらのパラメーターはリクエスト ペイロードに存在し、独自のカスタム ビューで取得できるため、これは非常に奇妙です。
解決策に最も近いのは、パラメーターをstate
正常に受け入れることができる独自のビューを作成することです。
これは、応答を処理し、 django-rest-framework-jwtを使用して新しい jwt トークンを作成する私のビューです。
class SocialAuthView(APIView):
throttle_classes = ()
permission_classes = ()
authentication_classes = ()
social_serializer = SocialAuthSerializer
user_serializer = None
def post(self, request):
access_token_url = 'https://accounts.google.com/o/oauth2/token'
people_api_url = 'https://www.googleapis.com/plus/v1/people/me/openIdConnect'
from django.conf import settings
payload = dict(client_id=request.data['clientId'],
redirect_uri=request.data['redirectUri'],
client_secret=settings.SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET,
code=request.data['code'],
grant_type='authorization_code')
# Step 1. Exchange authorization code for access token.
import requests
import json
r = requests.post(access_token_url, data=payload)
token = json.loads(r.text)
headers = {'Authorization': 'Bearer {0}'.format(token['access_token'])}
# Step 2. Retrieve information about the current user.
r = requests.get(people_api_url, headers=headers)
profile = json.loads(r.text)
try:
user = User.objects.filter(email=profile['email'])[0]
except IndexError:
pass
import jwt
from rest_framework_jwt.utils import jwt_payload_handler, jwt_encode_handler
if user:
payload = jwt_payload_handler(user)
token = jwt_encode_handler(payload)
return Response({'token': token.decode('unicode_escape')},
status=status.HTTP_200_OK)
u = User.objects.create(username=profile['name'], first_name=profile['given_name'],
last_name=profile['family_name'], email=profile['email'])
payload = jwt_payload_handler(user)
token = jwt_encode_handler(payload)
return Response({'Bearer': token.decode('unicode_escape')},
status=status.HTTP_200_OK)
つまり、機能しますが、Python ソーシャル認証で実装できた場合に得られるすべての利点が得られるわけではありません。このビューからdo_authのようないくつかの関数を呼び出す python social auth で認証する方法があるかもしれません。
この問題にどれだけ苦労しているかに驚かされます。
すべてのヘルプは大歓迎です。
tl,dr : Satellizer、django-rest-framework、python social authおよびJWTを使用して角度のある単一ページアプリケーションを実装する方法は?