zoukankan      html  css  js  c++  java
  • OAuth2.0

    OAuth2.0是一个安全的授权协议,可以为开放平台解决身份验证及授权的需求。很多开放平台都使用这种方式来提供OPEN API。

    值得一提的是,OAuth2.0不兼容OAuth,等于OAuth已经GG了。

    主要参考:

    https://cloud.tencent.com/developer/news/229775

    https://blog.csdn.net/sky786905664/article/details/52134585

    http://wiki.connect.qq.com/

    OAuth2.0的理论基础

    关键在于用户同意授权

    比如B是提供open api的QQ,A是第三方客户端sf.gg(思否网站),A想要做QQ登录的功能,A和B互不信任,B要保证自己的信息安全不泄露给A,怎么做?理论上是无法做到的,因为B无论提供什么数据,都有可能被A保存。但是,假如我是B的用户,我在登录A网站的时候,我同意A网站获取我在B网站的数据,这时候B就没有理由拒绝A网站获取我在B网站的数据了,因为是身为B网站信息所有者的我同意了,你没有理由拒绝。这时候再加上B网站在提供open api的时候控制信息的提供范围,比如只提供用户在B网站保存的昵称而不提供密码,这样,开放平台的授权,实现OAuth2.0协议,是可能的。

    OAuth2.0的四种模式

    四种模式,在四种不同的场景下使用不同的模式实现认证授权。OAuth2.0为这四种场景分别给出了四种解决方案,称之为四种模式,分别为:授权码模式(authorization code)、简化模式(implicit)、密码模式(resource owner password credentials)、客户端模式(client credentials)

    你不必纠结于这些没听过的名词,知道有这么个东西就行了。接下来将先介绍四种场景再介绍四种模式,一些文章直接先介绍模式再介绍使用的场景显然是本末倒置的,肯定是现有问题出现,然后才有的解决方案。

    1、第三方Web服务器端应用与第三方原生App

    这种场合是开放平台常用的场合:open api的提供者不信任一切的客户端。open api的提供者并不信任客户端应用。如果A网站想要调用B提供的open api,那A网站必须在B的平台上备案,备案成功了,B给A网站一个应用编号id和密钥key。在然后A网站就可以做B网站的第三方登录了。

    假设B网站是QQ,用户访问A网站时,看到A网站提供了QQ登录功能,点击了QQ登录,这时候跳转到了QQ提供的第三方登录页面(请注意这个页面是QQ的并不是A网站的),这个QQ登录页面可以输入QQ的账号密码,输入成功,代表你同意了A网站获取你的信息(这个信息的开放范围由QQ控制,一般不会太多),然后这个QQ登录页面又会跳转到A网站,同时给A网站一个code值(这个code代表了你同意A网站获取你在QQ上的信息),然后A网站使用在QQ上备案过的id和密钥key,再加上刚才给A网站的code值,用这三个参数,去换取token值,获取token值之后,A网站就可以使用token值来请求你在QQ上的数据信息了。

    我们分析下这个过程。A网站在QQ上备案过了,获取到了id和密钥key(密钥key要绝对保密不能泄露,而id却是可以公示的),用户在A网站点击“使用的QQ登录”时,A网站使用自己的id向QQ发起请求转到QQ授权登录页面,当用户在QQ的授权登录页面输入了账号密码同意A网站获取信息,并且返回了code值,这个code值,QQ是知道提供给了哪个网站的,并且也知道这个code值对应了哪一个用户。然后转到了A网站。这时A网站再使用id、code值和绝对保密只有自己知道的key,就可以获取token。就算非法分子拿到了id和code(这两个值在页面跳转连接中会作为url参数所以对所有人是透明的),不知道key,也无法非法获取用户信息。

    其中的code值便是授权码,这便是——授权码模式。

    2、第三方单页面应用

    上面的第一种情形,要求A网站必须拥有服务器,这样才能保存key值和发送请求获取token。但是对于一些纯展示的网站只有html+css+js,是行不通的。

    这时候就要简化授权码模式,称为简化模式。简化模式应用比较少并且简单,就带过了。

    3、第一方单页应用与第一方原生App

    open api的开发本就是为自己的APP或者应用提供接口,就可使用密码模式。

    我觉得密码模式和开放平台都没关系了,就是为自己的应用写接口,就是一个应用(或者是分布式应用)。假如你有一个app名字叫做支付宝(哈哈),然后你为这个支付宝写了一个后台,每个用户登录的时候就用自己的账号密码登录,登录后得到一个token值,以后就用token值请求数据就行了,和Basic Auth有点像。

    4、没有用户参与的,完全信任的服务器端服务

    客户端模式。最简单,密码都不用输入,A网站只有请求就给A网站提供数据。


    在开放平台中,常用的也就是授权码模式了吧。密码模式可以给自己的APP写接口时使用。其它两种用的太少了。

    QQ授权登录

    QQ授权登录就是一个典型的OAtuh2.0开发例子也是一个很好的学习教材,开发文档写的很详细

  • 相关阅读:
    【作业】Python
    【作业】判断某个数是否是素数,返回结果
    【案例】Python之列表反转
    Python模块
    【作业】Python-数据转换:将列表["mo","deng","ge"]和[1,2,3] 转换成[("mo",1),("deng",2),("ge",3)]
    【个人笔记】Python-zip()函数
    【作业】Python-数据转换:将列表[3,7,0,5,1,8]中大于5元素置为0,小于5的元素置为1
    【作业】Python-将元组(1,2,3) 和集合{"four",5,6}合成一个列表
    【作业】Python-函数封装:交换两个变量的值
    【个人笔记】Python-sorted()函数
  • 原文地址:https://www.cnblogs.com/gdpw/p/9196837.html
Copyright © 2011-2022 走看看