DjangoアプリケーションでFacebook経由の認証にpython-social-authを使用しています。しかし、ユーザーがログインしようとしたときに、Facebookアプリページに表示されたら、[キャンセル]ボタンをクリックします。次の例外が表示されます。
ERROR 2014-01-03 15:32:15,308 base :: Internal Server Error: /complete/facebook/
Traceback (most recent call last):
File "/home/vera/virtualenv/myapp/local/lib/python2.7/site-packages/Django/core/handlers/base.py", line 114, in get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/vera/virtualenv/myapp/local/lib/python2.7/site-packages/Django/views/decorators/csrf.py", line 57, in wrapped_view
return view_func(*args, **kwargs)
File "/home/vera/virtualenv/myapp/local/lib/python2.7/site-packages/social/apps/Django_app/utils.py", line 45, in wrapper
return func(request, backend, *args, **kwargs)
File "/home/vera/virtualenv/myapp/local/lib/python2.7/site-packages/social/apps/Django_app/views.py", line 21, in complete
redirect_name=REDIRECT_FIELD_NAME, *args, **kwargs)
File "/home/vera/virtualenv/myapp/local/lib/python2.7/site-packages/social/actions.py", line 54, in do_complete
*args, **kwargs)
File "/home/vera/virtualenv/myapp/local/lib/python2.7/site-packages/social/strategies/base.py", line 62, in complete
return self.backend.auth_complete(*args, **kwargs)
File "/home/vera/virtualenv/myapp/local/lib/python2.7/site-packages/social/backends/facebook.py", line 63, in auth_complete
self.process_error(self.data)
File "/home/vera/virtualenv/myapp/local/lib/python2.7/site-packages/social/backends/facebook.py", line 56, in process_error
super(FacebookOAuth2, self).process_error(data)
File "/home/vera/virtualenv/myapp/local/lib/python2.7/site-packages/social/backends/oauth.py", line 312, in process_error
raise AuthCanceled(self, data.get('error_description', ''))
AuthCanceled: Authentication process canceled
Djangoをキャッチする方法はありますか?
ミドルウェアを作成して、例外、例外リストをキャッチできます: https://github.com/omab/python-social-auth/blob/master/social/exceptions.py この場合、AuthCanceled例外。
middleware.py
from social.apps.Django_app.middleware import SocialAuthExceptionMiddleware
from Django.shortcuts import HttpResponse
from social import exceptions as social_exceptions
class SocialAuthExceptionMiddleware(SocialAuthExceptionMiddleware):
def process_exception(self, request, exception):
if hasattr(social_exceptions, 'AuthCanceled'):
return HttpResponse("I'm the Pony %s" % exception)
else:
raise exception
settings.py
MIDDLEWARE_CLASSES = (
.....
'pat_to_middleware.SocialAuthExceptionMiddleware',
)
python-social-auth
は、Django-social-auth
の新しい派生バージョンです。
AlexYarの answer は、次の変更を加えてpython-social-auth
を変更することにより、settings.py
で動作するようにわずかに変更できます。
SocialAuthExceptionを処理するミドルウェアを追加します
MIDDLEWARE_CLASSES += (
'social.apps.Django_app.middleware.SocialAuthExceptionMiddleware',
)
例外が発生したときにリダイレクトするURL
SOCIAL_AUTH_LOGIN_ERROR_URL = '/'
また、設定する必要があることに注意してください
DEBUG = False
それだけか読んでください http://python-social-auth.readthedocs.org/en/latest/configuration/Django.html#exceptions-middleware
これは@Nicolasの回答を少し変更したもので、私にとってはうまくいきます。
middleware.py
from social.apps.Django_app.middleware import SocialAuthExceptionMiddleware
from Django.shortcuts import render
from social.exceptions import AuthCanceled
class SocialAuthExceptionMiddleware(SocialAuthExceptionMiddleware):
def process_exception(self, request, exception):
if type(exception) == AuthCanceled:
return render(request, "pysocial/authcancelled.html", {})
else:
pass
settings.py
MIDDLEWARE_CLASSES += (
'myapp.middleware.SocialAuthExceptionMiddleware',
)
追加するだけです
MIDDLEWARE_CLASSES =( 'social_auth.middleware.SocialAuthExceptionMiddleware'、)
とのようなもの
LOGIN_ERROR_URL = '/'
それだけか読んでください http://Django-social-auth.readthedocs.org/en/latest/configuration.html#exceptions-middleware
2018年の回答:
構成にSocialAuthExceptionMiddleware
ミドルウェアを追加します。
MIDDLEWARE_CLASSES = [
...
'social_Django.middleware.SocialAuthExceptionMiddleware',
]
設定でSOCIAL_AUTH_LOGIN_ERROR_URL
を設定します。
SOCIAL_AUTH_LOGIN_ERROR_URL = '/login'
これで、DEBUG = False
がある場合、ユーザーはソーシャル認証プロバイダーのページで[キャンセル]をクリックすると、ログインページにリダイレクトされます。
DEBUG = True
の場合でも、開発中にブラウザにエラーページが表示されます。
例外の処理を気にしない場合は、settings.py
で次のようにします。
SOCIAL_AUTH_RAISE_EXCEPTIONS = False
この回答を参照してください: 認証プロセスのキャンセルエラーを解決する方法は?
これは、social_Djangoを使用して更新されたインポートミドルウェアです
from social_Django.middleware import SocialAuthExceptionMiddleware
from social_core import exceptions as social_exceptions
from Django.shortcuts import HttpResponse
from Django.shortcuts import render, redirect
class FacebookAuthCanceledExceptionMiddleware(SocialAuthExceptionMiddleware):
def process_exception(self, request, exception):
if hasattr(social_exceptions, 'AuthCanceled'):
return redirect('auth_login')
else:
raise exception