我找到了这段代码,可以帮助我验证用户身份,然后为他们创建rest_framework令牌。我使用的客户端是一个原生的Android应用程序,我将从客户端获取访问令牌,并将其发布到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访问令牌,然后使用rest_framework创建一个用户。它接受请求并使用后端,例如'facebook'。
如果用户使用我的后端登录,那么后端是'auth',它使用检索电子邮件和密码的正常过程,然后给我一个令牌供我使用。详细here
我的问题是如何将身份验证后端发布为'facebook'或'auth'以便我可以收到令牌?
我尝试过的。 我尝试使用访问令牌发送后端类型('facebook'或'auth'),但是我得到一个错误,该方法需要3个参数,而我只提供了2个。 我试过让网址像这样一个后端:
url(r'^login/(?P<backend>[^/]+)/$',views.ObtainAuthToken.as_view())
然后将访问令牌发送到类似于mysite.com:8000/login/facebook的网址。
这些都不起作用,我对psa或django没有多少经验知道如何传递这个参数。
如何发送使用哪个后端以便方法可以接受?如果有人曾经有这个用例,请帮助我。
答案 0 :(得分:1)
根据我的理解,社交登录需要一个访问令牌,所以当你在调用'mysite.com:8000/login/facebook'登录facebook时,它会期待一个访问令牌,
对于我的项目我将我的网址定义为'url(r'^ login /(?P [^ /] +)/ $',register_by_access_token,name ='register_by_access_token')',其中我发送的令牌完成登录,对于Facebook我发送后端作为'facebook'谷歌我发送后端作为'谷歌oauth2',但两种情况我发送一个令牌给我我各自的后端,当你没有使用第三方后端你不会得到令牌和登录期望。
所以我的建议是,如果你要使用auth使用正常的登录帖子,而不是相同的URL。