Google 使用 django-rest-auth 和 allauth 进行身份验证
Google authentication using django-rest-auth and allauth
我正在尝试为 flutter 应用程序创建身份验证 API,用户将使用 google 身份验证 signup/login 表单登录。我按照这个 tutorial 来实现这个。
到目前为止一切顺利,除了本教程基于 GitHub 登录而不是 Google。我设法让它工作直到步骤“连接”步骤。我能够从重定向中获取 code
,但是当我访问 http://127.0.0.1:8000/auth/google/
时,我看到它要求两个字段(access_token
、code
)。当我尝试仅 post 使用我所拥有的信息时,出现以下错误:
"non_field_errors": [
"View is not defined, pass it as a context variable"
]
这是与 djangorestframework => 3.12 的版本冲突错误
解决方案:降级到 djangorestframework <= 3.11.0 应该没问题。
试试这个:
class GoogleLogin(SocialLoginView):
adapter_class = GoogleOAuth2Adapter
client_class = OAuth2Client
serializer_class = SocialLoginSerializer
def get_serializer(self, *args, **kwargs):
serializer_class = self.get_serializer_class()
kwargs['context'] = self.get_serializer_context()
return serializer_class(*args, **kwargs)
google_login = GoogleLogin.as_view()
我想在 JACKSON MOURA 代码片段中添加详细信息并进行解释。
在settings.py中,你必须这样做。我没有找到任何好的文档。但它适用于社会认证。现在您不再需要使用管理面板来设置社交身份验证应用程序。我展示了 Google、Facebook 和 LinkedIn 的样本。它也适用于其他社交应用程序。
SOCIALACCOUNT_PROVIDERS = {
"google": {
"APP": {
"client_id": "<client_id>",
"secret": "<secret>",
},
},
'facebook': {
"APP": {
"client_id": "<client_id>",
"secret": "<secret>",
},
},
"linkedin": {
"APP": {
"client_id": "<client_id>",
"secret": "<secret>",
}
}
}
现在 view.py,您必须创建序列化程序 类。一切都会一样。我正在为 Google、LinkedIn 和 Facebook 展示。
class FacebookLogin(SocialLoginView):
adapter_class = FacebookOAuth2Adapter
client_class = OAuth2Client
serializer_class = SocialLoginSerializer
def get_serializer(self, *args, **kwargs):
serializer_class = self.get_serializer_class()
kwargs['context'] = self.get_serializer_context()
return serializer_class(*args, **kwargs)
class GoogleLogin(SocialLoginView):
adapter_class = GoogleOAuth2Adapter
client_class = OAuth2Client
serializer_class = SocialLoginSerializer
def get_serializer(self, *args, **kwargs):
serializer_class = self.get_serializer_class()
kwargs['context'] = self.get_serializer_context()
return serializer_class(*args, **kwargs)
class LinkedInLogin(SocialLoginView):
adapter_class = LinkedInOAuthAdapter
client_class = OAuthClient
serializer_class = SocialLoginSerializer
def get_serializer(self, *args, **kwargs):
serializer_class = self.get_serializer_class()
kwargs['context'] = self.get_serializer_context()
return serializer_class(*args, **kwargs)
现在,后端已准备好从前端获取 post 数据,并将显示如下所示的完美错误。它将与所有其他社交应用程序一起使用。
因为rest_auth不再维护,不兼容最新版本的Django Rest Framework
此错误已通过切换到 dj-rest-auth 而不是 rest_auth 得到解决,后者是原始项目的积极维护分支。
我正在尝试为 flutter 应用程序创建身份验证 API,用户将使用 google 身份验证 signup/login 表单登录。我按照这个 tutorial 来实现这个。
到目前为止一切顺利,除了本教程基于 GitHub 登录而不是 Google。我设法让它工作直到步骤“连接”步骤。我能够从重定向中获取 code
,但是当我访问 http://127.0.0.1:8000/auth/google/
时,我看到它要求两个字段(access_token
、code
)。当我尝试仅 post 使用我所拥有的信息时,出现以下错误:
"non_field_errors": [
"View is not defined, pass it as a context variable"
]
这是与 djangorestframework => 3.12 的版本冲突错误 解决方案:降级到 djangorestframework <= 3.11.0 应该没问题。
试试这个:
class GoogleLogin(SocialLoginView):
adapter_class = GoogleOAuth2Adapter
client_class = OAuth2Client
serializer_class = SocialLoginSerializer
def get_serializer(self, *args, **kwargs):
serializer_class = self.get_serializer_class()
kwargs['context'] = self.get_serializer_context()
return serializer_class(*args, **kwargs)
google_login = GoogleLogin.as_view()
我想在 JACKSON MOURA 代码片段中添加详细信息并进行解释。
在settings.py中,你必须这样做。我没有找到任何好的文档。但它适用于社会认证。现在您不再需要使用管理面板来设置社交身份验证应用程序。我展示了 Google、Facebook 和 LinkedIn 的样本。它也适用于其他社交应用程序。
SOCIALACCOUNT_PROVIDERS = {
"google": {
"APP": {
"client_id": "<client_id>",
"secret": "<secret>",
},
},
'facebook': {
"APP": {
"client_id": "<client_id>",
"secret": "<secret>",
},
},
"linkedin": {
"APP": {
"client_id": "<client_id>",
"secret": "<secret>",
}
}
}
现在 view.py,您必须创建序列化程序 类。一切都会一样。我正在为 Google、LinkedIn 和 Facebook 展示。
class FacebookLogin(SocialLoginView):
adapter_class = FacebookOAuth2Adapter
client_class = OAuth2Client
serializer_class = SocialLoginSerializer
def get_serializer(self, *args, **kwargs):
serializer_class = self.get_serializer_class()
kwargs['context'] = self.get_serializer_context()
return serializer_class(*args, **kwargs)
class GoogleLogin(SocialLoginView):
adapter_class = GoogleOAuth2Adapter
client_class = OAuth2Client
serializer_class = SocialLoginSerializer
def get_serializer(self, *args, **kwargs):
serializer_class = self.get_serializer_class()
kwargs['context'] = self.get_serializer_context()
return serializer_class(*args, **kwargs)
class LinkedInLogin(SocialLoginView):
adapter_class = LinkedInOAuthAdapter
client_class = OAuthClient
serializer_class = SocialLoginSerializer
def get_serializer(self, *args, **kwargs):
serializer_class = self.get_serializer_class()
kwargs['context'] = self.get_serializer_context()
return serializer_class(*args, **kwargs)
现在,后端已准备好从前端获取 post 数据,并将显示如下所示的完美错误。它将与所有其他社交应用程序一起使用。
因为rest_auth不再维护,不兼容最新版本的Django Rest Framework
此错误已通过切换到 dj-rest-auth 而不是 rest_auth 得到解决,后者是原始项目的积极维护分支。