美文网首页django-rest-frameworkDjangorest framework api
django-restful:第三方登录接口 学习记录(二)

django-restful:第三方登录接口 学习记录(二)

作者: 你常不走的路 | 来源:发表于2018-01-17 13:29 被阅读21次

    这里我们使用 别人的 第三方包 来 第三方登录 github地址 https://github.com/python-social-auth/social-app-django 大家可以去 看看

    安装
    pip install social-auth-app-django
    

    如果你用mongodb做为数据库 则安装不同的

    pip install social-auth-app-django-mongoengine
    
    django配置

    在settings 中 添加它 然后

    #添加过后 记得  migrate   由于它 本身 给我们提供了 一些表 
    INSTALLED_APPS = (
        ...
        'social_django',
        ...
    )
    
    注意 进行 migrate 同时mongodb 跟这也不同 我就 不写了 自己去看看文档

    下面是 验证

    大家可以去自己的虚拟环境中 social_core 这个包 下面 找到 这个路径 看看 他集成了很多第三方登录 可以自己选择 我们这里只选用了 几个常见的 微博 qq 微信
    AUTHENTICATION_BACKENDS = (
        'social_core.backends.weibo.WeiboOAuth2',  # 使用第三方库  配置 第三方登录
        'social_core.backends.qq.QQOAuth2',
        'social_core.backends.weixin.WeixinOAuth2',  # 微博 qq 微信
        'users.views.CustomBackend',  # 自定义验证登录
        'django.contrib.auth.backends.ModelBackend',  
    )
    
    集成的各种第三方登录包.PNG

    就是在这个app下面 里面还有很多 我只是截取一部分

    url配置
    urlpatterns = patterns('',
        ...
        # jwt的认证接口  #由于第三方登录  中也有login 所以我们在这需要加上$ 必须以login结束
        url(r'^login/$', obtain_jwt_token),  ###这句话是我自己加上的  方便 理解  防止  出错
        url('', include('social_django.urls', namespace='social'))#把这句放到 url中就行了 
        ...
    )
    
    可以自己去 urls中看看他的所有url
    同时注意 本身 我们是有 ##login## url了 但是 这个 social_django.urls中 也有 login
    所以 我们配置 我们自己的login 时 需要加上$
    如果 你是用的 django 而不是 django-restful
    <a href="{% url "social:begin" "google-oauth2" %}">Google+</a> 
    
    加上这个 就可以使用了 谷歌登录了
    但是我们这里使用的是 django-restful 所以不用了
    settings中配置 templates
    TEMPLATES = [
        {
            ...
            'OPTIONS': {
                ...
                'context_processors': [
                    ...
                    'social_django.context_processors.backends',   #加上这两句 就行了  
                    'social_django.context_processors.login_redirect',
                    ...
                ]
            }
        }
    ]
    

    然后就是 Keys and secrets 的配置

    SOCIAL_AUTH_WEIBO_KEY = '你的appkey'   #如果还需要配置其他的  修改一下 WEIBO  为其他的
    SOCIAL_AUTH_WEIBO_SECRET = '你的 secret'
    

    还有就是 回调 到那个网页 也需要 在 settings中配置 我们这里回调懂到首页 可自己修改

    SOCIAL_AUTH_LOGIN_REDIRECT_URL = '/index/'   #可以自己修改
    LOGIN_REDIRECT_URL = '/index/'
    

    然后 就是关键了 由于我们采用了jwt验证模式 所以授权通过后 回调 他并不会给我们 登录用户

    所以我们 需要修改一些源码

    同样还是在 social_core 复制这个app 到我们的项目目录下

    找到 social_core 下的 actions.py 文件 进行修改 添加 验证

    from rest_framework_jwt.serializers import jwt_encode_handler, jwt_payload_handler
    
    def do_complete(backend, login, user=None, redirect_name='next',
                    *args, **kwargs):
        ....
        if backend.setting('SANITIZE_REDIRECTS', True):
            allowed_hosts = backend.setting('ALLOWED_REDIRECT_HOSTS', []) + \
                            [backend.strategy.request_host()]
            url = sanitize_redirect(allowed_hosts, url) or \
                  backend.setting('LOGIN_REDIRECT_URL')
        response = backend.strategy.redirect(url)
        #由于本身重定向回调到我们的页面  却无法登录因为 我们采用了 jwt 的验证模式
        #验证是从 cookie 中找 name token 这两个字段来登录用户  所以我们在重定向时  给他设置 cook来登录 同时要注意 设置 过期时间
        payload = jwt_payload_handler(user)
        # 加密
        response.set_cookie('token',jwt_encode_handler(payload),max_age=24*3600)
        response.set_cookie('name',user.name if user.name else user.username,max_age=24*3600)   #需要过期时间
        return response
    

    相关文章

      网友评论

        本文标题:django-restful:第三方登录接口 学习记录(二)

        本文链接:https://www.haomeiwen.com/subject/rknyoxtx.html