Facebook Login使用Django Rest Auth返回"Incorrect value"非字段错误如何解决
解决方案
你遇到的Incorrect value400报错,是因为当前使用的django-rest-auth 0.9.5版本默认的Facebook登录逻辑和你传参场景不匹配,默认适配的是前端授权后带回调code的场景,而非直接传access_token的场景,和你之前自定义Google适配器适配id_token验签的逻辑一致,Facebook也需要自定义适配器适配。
步骤1:自定义Facebook OAuth2适配器
在你的views.py中添加如下代码:
import requests from allauth.socialaccount.providers.facebook.views import FacebookOAuth2Adapter class FacebookOAuth2AdapterAccessToken(FacebookOAuth2Adapter): def complete_login(self, request, app, token, **kwargs): # 用传入的access_token直接请求Facebook接口拉取用户信息 resp = requests.get( 'https://graph.facebook.com/me', params={ 'fields': 'id,email,name', 'access_token': token.token, } ) resp.raise_for_status() extra_data = resp.json() # 校验返回的用户id是否存在 if 'id' not in extra_data: raise ValueError('Invalid Facebook access token') # 生成social login对象 login = self.get_provider().sociallogin_from_response(request, extra_data) return login
步骤2:修改FacebookLogin视图的适配器配置
把你原来的FacebookLogin类替换成如下代码:
class FacebookLogin(SocialLoginView): adapter_class = FacebookOAuth2AdapterAccessToken client_class = OAuth2Client def get_serializer(self, *args, **kwargs): serializer_class = self.get_serializer_class() kwargs['context'] = self.get_serializer_context() return serializer_class(*args, **kwargs)
步骤3:校验请求参数与配置
- 确保请求POST参数的key为
access_token,不要拼写错误 - 确认你后端settings.py中配置了正确的Facebook应用参数:
SOCIALACCOUNT_PROVIDERS = { 'facebook': { 'APP': { 'client_id': '你的Facebook应用ID', 'secret': '你的Facebook应用密钥', 'key': '' }, 'SCOPE': ['email', 'public_profile'], 'AUTH_PARAMS': {'auth_type': 'reauthenticate'}, 'METHOD': 'oauth2', 'VERIFIED_EMAIL': False, 'VERSION': 'v18.0' } } - 确认前端请求的access_token是使用和后端相同的Facebook应用ID申请的,且Facebook应用已发布,允许的域名包含你项目的前端/后端域名。
内容的提问来源于stack exchange,提问作者Harsh Sonawane
相关产品推荐
相关产品推荐

