zoukankan      html  css  js  c++  java
  • 第三方登录

    第三方登录介绍:

    现在许多网站都能使用微信登录,QQ登录,微博登录等。相对普通登录来说,第三方登录使用更方便,对于普通登录来说,忘记密码后修改密码会比较麻烦,而且时间有些长。第三方登录只要你能在微信,QQ,或者微博上登录就可以,对我们非常方便。

    第三方登录(微博)的逻辑:

    1.首先要去微博开发者页面,完成验证,才可以新建应用

    2、建好应用之后就可以拿到应用的App Key, App Secret,需要设置好回调地址

    3、要是系统还没开发完成,可以使用测试模式,需要自己手动添加可以登录的微博

    第三方登录(微博)流程:

    1)外部标识

    用来使用用户身份的标志,可以是用户名,手机号,邮箱等,每一个外部标识一定和一个内部标识相关联用以确定一个用户。

    需要注意的是,外部标识可能改变,例如小明12年用的是手机号A,17年用的是手机号B,在APP内更改了登录的手机号,就完成了外部标识的改变。

    所以,外部标识的作用有两个

    1. 让用户通过自己熟知且占有的外部标识来登录产品

    2. 可以通过校验外部标识来实现找回或转移数据资产(用户注册帐号后使用产品过程中产生的所有数据,例如在微信,数据资产是你的好友,历史聊天记录,所发的朋友圈;而在游戏中是你的游戏角色,拥有的装备,好友等)

    2)内部标识

    即产品中用于标识用户唯一性的标志,例如user_id,必须有,不可更改且唯一,用户一般接触不到内部标识。

    当一个内部标识建立后,用户所有的数据资产都会绑定到这个内部标识上。

    3)user_id

    一个常用的内部标识,类似你的18位身份证ID

    4)app_id

    用于区别不同APP的ID,具有唯一性。

    5)open_id

    第三方平台为了用户信息的安全,一般不会直接将用户的内部标识给到其他产品,而是选择了给一个外部标识,这个open_id就是微信给各个APP用以区分微信用户身份的外部标识

    需要注意的是,即使是同一个用户,微信给不同的APP的open_id也是不同的,这会导致一个问题。

    例如我有两款产品,一款美团,一款美团外卖。

    对微信而言,这是两个app_id,所以当用户授权

    美团

    使用微信信息后,微信给的是

    open_id_1

    ,用户再来到

    美团外卖公众号

    ,这时候还要再授权一次,微信给的是

    open_id_2

    但实际上在美团的帐号体系中,这都是同一个用户,却绑定了两个open_id,可能导致用户注册了两个帐号,数据不会互通,这显然是有问题的。

    如何解决?往下看

    6)union_id

    为了解决上面的问题,union_id诞生了。

    不同的产品的可以使用同一个union_id来确认用户的身份。

    对于使用同一套用户数据的不同产品,可以向微信申请union_id,当A产品获得了用户授权后,拿到该用户的union_id,这时候再使用B产品再进行授权后,发现这是同一个union_id,直接登录之前的帐户,避免了同个微信用户注册了两个帐号数据不同步的问题。

    7)access_token

    可以理解为通行证,有了这个通行证,就能获取到第三方平台指定用户的有限信息。

    8)OAuth 2.0

    这个不太容易解释,我们简单的理解为授权的通用协议

    为什么需要这个,我们假设这样一个场景

    假设你是做电商的,一位快递天天都需要上门到你家取件,但是你居住的小区是有门禁的,进入小区的方式有两种

    1.利用你家的门禁卡(这个门禁卡能打开小区门和你家的电子门)

    2.利用小区的临时门禁卡进入

    这两种方式, 显然第二种是更安全的,因为快递小哥只需要有临时卡进入小区,然后到你家按门铃,你再交付快递给他就好。而直接将你家的门禁卡给他,显然不理智。

    现实中的例子很好理解,那么在第三方登录中也是如此

    APP → 快递小哥

    第三方应用 → 你家

    用户信息 → 快递件

    第三方应用平台下用户的帐号和密码 → 你家的门禁卡

    Token → 小区临时门禁卡

    APP(快递小哥)需要从第三方应用那拿到你的资料(快件),显然第三方应用不可能把帐号和密码(你家的门禁卡)给APP,这时候提供一个Token(临时的小区门禁卡),让APP既能获取到你的用户信息(快件),又保证了安全

    第三方登录(微博)代码:

     client_id 必填 string 申请应用时分配的AppKey。

        redirect_uri 必填 string 授权回调地址,站外应用需与设置的回调地址一致。

      

    #获取微博登录页面url

    def get_auth_url():

        weibo_auth_url = "https://api.weibo.com/oauth2/authorize"

        redirect_url = "http://127.0.0.1:8001/complete/weibo/"

        client_id = "AppKey"

        auth_url = weibo_auth_url + "?client_id={client_id}&redirect_uri={re_url}".format(client_id=client_id,

                                                                                          re_url=redirect_url)

        print(auth_url)

    #获取登录的token,这里是拿到登录的code

    #code会拼接在回调地址后面返回http://127.0.0.1:8001/complete/weibo/?code=c53bd7b5af51ec985952a3c03de3b

    def get_access_token(code):

        access_token_url = "https://api.weibo.com/oauth2/access_token"

        import requests

        re_dict = requests.post(access_token_url,data={

            "client_id": AppKey,

            "client_secret": "App Secret",

            "grant_type": "authorization_code",

            "code": code,

            "redirect_uri": "http://127.0.0.1:8001/complete/weibo/",

        })

       # '{"access_token":"2.00oneFMeMfeS0889036fBNW_B","remind_in":"15799","expires_in":15799,"uid":"5675652","isRealName":"true"}'

        pass

    #获取带有微博用户json信息的url

    def get_user_info(access_token):

        user_url = "https://api.weibo.com/2/users/show.json"

        uid = "5675652"

        get_url = user_url + "?access_token={at}&uid={uid}".format(at=access_token, uid=uid)

        print(get_url)

    if __name__ == '__main__':

        # get_auth_url()

        #通过code获取access_token

         get_access_token("c53bd7b5af51ec985952a3c03de3b")

        #通过access_token获取用户的信息

        get_user_info("2.00oneFMeMfeS0889036fBNW_B")

    后续跟进QQ,微信第三方登录。

  • 相关阅读:
    图像裁剪功能,鼠标抬起移除事件,不只是想去掉鼠标抬起时的裁剪事件,重要的是jquery绑定的都是dom2级事件
    在 JavaScript 里 + 会把一些字符转化成数字
    ++[[]][+[]]+[+[]] == 10 //true
    node 接口
    windows下,node.js默认执行的根目录
    鸟速度不匀速的方法Math.sqrt(this.i++); 开根号
    rotate 里面的是弧度不是度,如果需要度则要转成度 Math.PI/180
    定义一个数,它可能为正 也可能为负 var num = Math.pow(-1,parseInt(Math.random() * 2) + 1);
    如何单独使用modelsim进行仿真
    Xilinx开发板信息
  • 原文地址:https://www.cnblogs.com/chengdongzi/p/10646310.html
Copyright © 2011-2022 走看看