我发现这段代码可以帮助我对用户进行身份验证,然后为他们创建一个 rest_framework token 。我使用的客户端是 native android 应用程序,我将从客户端获取访问 token 并将其发布到 ObtainAuth 类中的 django。 这是服务器端的代码。
@psa('social:complete')
def register_by_access_token(request, backend):
backend = request.strategy.backend
# Split by spaces and get the array
auth = get_authorization_header(request).split()
if not auth or auth[0].lower() != b'token':
msg = 'No token header provided.'
return msg
if len(auth) == 1:
msg = 'Invalid token header. No credentials provided.'
return msg
access_token = auth[1]
user = backend.do_auth(access_token)
return user
class ObtainAuthToken(APIView):
model = Token
serializer_class = AuthTokenSerializer
parser_classes = (parsers.FormParser, parsers.MultiPartParser, parsers.JSONParser,)
renderer_classes = (renderers.JSONRenderer,)
def post(self,request):
serializer = self.serializer_class(data= request.DATA)
if backend == 'auth':
if serializer.is_valid:
token, created = Token.objects.get_or_create(user=serializer.object['user'])
if token:
return Response({'token': token.key})
else:
return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)
else:
user = register_by_access_token(request, backend)
if user and user.is_active:
token, created = Token.objects.get_or_create(user=user)
return Response({'id': user.id, 'email': user.email, 'firstname': user.first_name, 'userRole': 'user', 'token': token.key})
register_by_access_token 方法将获取 facebook 访问 token ,然后使用 rest_framework 创建用户。它需要一个请求和要使用的后端,例如“facebook”。
如果用户使用我的后端登录,那么后端是“auth”,它使用检索电子邮件和密码的正常过程,然后给我一个要使用的 token 。详见 here
我的问题是如何发布身份验证后端(“facebook”或“auth”)以便我可以接收 token ?
我试过的。 我尝试使用访问 token 发送后端类型(“facebook”或“auth”),但我收到一个错误消息,该方法需要 3 个参数,而我只提供了 2 个。 我试过让 url 采用这样的后端:
url(r'^login/(?P<backend>[^/]+)/$',views.ObtainAuthToken.as_view())
然后将访问 token 发送到类似 mysite.com:8000/login/facebook 的 url。
这些都不起作用,我对 psa 或 django 没有太多经验,不知道如何传递此参数。
如何发送要使用的后端,以便该方法可以接受它?如果有人遇到过这个用例,请帮助我。
最佳答案
根据我的理解,社交登录需要访问 token ,因此当您使用 facebook 登录时调用“mysite.com:8000/login/facebook”时,它需要访问 token ,
对于我的项目,我将我的 url 定义为 'url(r'^login/(?P[^/]+)/$',register_by_access_token,name='register_by_access_token')',使用我发送的 token 完成登录,对于 facebook,我将后端发送为“facebook”,对于谷歌,我将后端发送为“google-oauth2”,但在这两种情况下,我都在给定各自的后端发送 token ,当您不使用第三方后端时,您将无法获得 token 和登录期望的。
所以我的建议是,如果您要使用身份验证,请使用普通登录帖子,而不是相同的 URL。
关于python - 使用python social auth通过访问 token 注册用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26942843/