将django-allauth作为端点插入django-rest-framework [英] Plug in django-allauth as endpoint in django-rest-framework

查看:203
本文介绍了将django-allauth作为端点插入django-rest-framework的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在我的网站上使用django-allauth进行社交登录。我还有一个由django-rest-framework提供的REST API,作为移动应用的后端。有没有办法可以直接将allauth的身份验证后端插入REST api,以便我可以在移动应用程序中验证(并注册)使用Facebook登录的用户?



澄清:Facebook登录部分由本机SDK处理。我需要一个端点,像 POST / user (即创建一个新用户),但是将Facebook oauth令牌作为输入而不是电子邮件/密码等。

解决方案

您可以使用此库来进行社交认证 django-rest-framework-social-oauth2 。尝试这个django-allauth相关代码



urls.py



  urlpatterns = [
url(
r'^ rest / facebook-login / $',
csrf_exempt(RestFacebookLogin.as_view()),
name ='rest-facebook-login'
),
]



serializers.py



  class EverybodyCanAuthentication(SessionAuthentication):
def authenticate(self,request):
return None



views.py



  class RestFacebookLogin APIView)

根据来自Facebook的身份验证令牌
登录或注册用户
返回包含会话ID的用户数据


#这是一个公开的api!
permission_classes =(AllowAny,)
authentication_classes =(EverybodyCanAuthentication,)

def dispatch(self,* args,** kwargs):
return super(RestFacebookLogin,自我).dispatch(* args,** kwargs)

def get(self,request,* args,** kwargs):
try:
original_request = request._request
auth_token = request.GET.get('auth_token','')

#查找与传递的Auth令牌相匹配的令牌
app = SocialApp.objects.get(provider = 'facebook')
fb_auth_token = SocialToken(app = app,token = auth_token)

#检查令牌对于Facebook
login = fb_complete_login(original_request,app,fb_auth_token)
login.token = fb_auth_token
login.state = SocialLogin.state_from_request(original_request)

#将用户添加或更新到用户表
complete_so cial_login(original_request,login)
#创建或获取此用户的会话ID
令牌,_ = Token.objects.get_or_create(user = original_request.user)
#如果我们到这里'成功
data = {
'username':original_request.user.username,
'objectId':original_request.user.pk,
'firstName':original_request.user。 first_name,
'lastName':original_request.user.last_name,
'sessionToken':token.key,
'email':original_request.user.email,
}
返回响应(
status = 200,
data = data


除了:
返回响应(status = 401,data = {
'detail':'Bad Access Token',
})


I'm using django-allauth on my website for social logins. I also have a REST API powered by django-rest-framework that serves as the backend of a mobile app. Is there a way I can directly plug in allauth's authentication backend to the REST api so that I can validate (and register) users who use Facebook login in the mobile app?

To clarify: The Facebook login part is handled by native SDKs. I need an endpoint that works like POST /user (that is, creates a new user), but takes Facebook oauth token as input instead of email/password etc.

解决方案

You can use this libray for social authentication django-rest-framework-social-oauth2. Try this django-allauth related code

urls.py

urlpatterns = [
    url(
        r'^rest/facebook-login/$',
        csrf_exempt(RestFacebookLogin.as_view()),
        name='rest-facebook-login'
    ),
]

serializers.py

class EverybodyCanAuthentication(SessionAuthentication):
    def authenticate(self, request):
        return None

views.py

class RestFacebookLogin(APIView):
    """
    Login or register a user based on an authentication token coming
    from Facebook.
    Returns user data including session id.
    """

    # this is a public api!!!
    permission_classes = (AllowAny,)
    authentication_classes = (EverybodyCanAuthentication,)

    def dispatch(self, *args, **kwargs):
        return super(RestFacebookLogin, self).dispatch(*args, **kwargs)

    def get(self, request, *args, **kwargs):
        try:
            original_request = request._request
            auth_token = request.GET.get('auth_token', '')

            # Find the token matching the passed Auth token
            app = SocialApp.objects.get(provider='facebook')
            fb_auth_token = SocialToken(app=app, token=auth_token)

            # check token against facebook
            login = fb_complete_login(original_request, app, fb_auth_token)
            login.token = fb_auth_token
            login.state = SocialLogin.state_from_request(original_request)

            # add or update the user into users table
            complete_social_login(original_request, login)
            # Create or fetch the session id for this user
            token, _ = Token.objects.get_or_create(user=original_request.user)
            # if we get here we've succeeded
            data = {
                'username': original_request.user.username,
                'objectId': original_request.user.pk,
                'firstName': original_request.user.first_name,
                'lastName': original_request.user.last_name,
                'sessionToken': token.key,
                'email': original_request.user.email,
            }
            return Response(
                status=200,
                data=data
            )

        except:
            return Response(status=401, data={
                'detail': 'Bad Access Token',
            })

这篇关于将django-allauth作为端点插入django-rest-framework的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆