• OAuth 2.0详解


    OAuth 2.0详解

    概念:OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如基本消息,照片,联系人列表),

    而无需将 用户名密码 提供给第三方应用。

    一、应用场景

    为了理解OAuth的适用场合,这里举一个使用第三方账户进行登录的例子。

    现在一般登陆都会采用 第三方授权 登陆,比较常见就是微信、qq、微博授权登陆。这里以微信授权登陆为例:

    现在我在未注册的情况下去访问A网站,A网站 为了提高用户体验,可以省去你在这次网站申请注册的步骤,让你通过微信授权登陆去拿去你在微信上的基本信息。

    问题就在这里,如果拿到微信用户基本信息给到A网站,直接给A网站我登陆微信的账号密码,那么问题可想而知。

    1、这个也太不安全了,我只想给A网站我的在微信上的基本信息,而不是所有信息,通过用户密码可以获取我的所有信息。

    2、用户只有修改密码,才能收回赋予"A网站"的权力。但是这样做,会使得其他所有获得用户授权的第三方应用程序全部失效。

    3、只要有一个第三方应用程序被破解,就会导致用户密码泄漏,以及所有被密码保护的数据泄漏。

    OAuth就是为了解决上面这些问题而诞生的。

    从上面可以看出主要有三个身份

    用户

    使用第三方账户登录一个新的网站,对于用户来说就不需要走复杂的注册流程。

    第三方平台(微信)

    上面来讲 微信 就是第三方平台,那么对于第三方如何做才能保证用户的安全呢?

    就在A网站在通过微信授权登陆之前,需要提供资质到微信,微信审核,审核通过后给要求接入的服务商一个唯一凭证,标明服务商身份。

    服务商(A网站)

    我们要做的就是将这两者进行连接起来,先到第三方平台资质审核,审核通过后,用户去第三方平台授权登录后,就可以获取用户基本信息,完成登陆。


    二、OAuth的思路

    这里还是以 服务商(A网站),和 第三方平台(微信)授权登录来缕这个思路。

    OAuth在 服务商(A网站)第三方平台(微信) 之间,设置了一个授权层(authorization layer)。服务商 不能直接登录 第三方平台,只能登录授权层,

    以此将用户与服务商(A网站)区分开来。服务商(A网站) 登录授权层所用的令牌(token),与用户的密码不同。用户可以在登录的时候,指定授权层令牌的权限范围和有效期。

    服务商(A网站) 登录授权层以后,第三方平台 根据令牌的权限范围和有效期,向 服务商(A网站) 开放用户储存的资料。

    这里缕下大致流程

    1、接入前准备(资质审核)

    如果一个服务商需要使用第三方平台的服务,那么首先是需要向第三方平台提供资料,第三方平台审核通过后,会给服务商一个唯一标识的ID,这样通过第三方平台授权的时候,

    第三方平台就知道是哪个商户了。

    一般来说你会得到如下的两个参数:

    appid 代表你的应用唯一ID
    appsecret 对应的密钥
    

    这个部分每家平台都不一样,具体如何获取你的APPID请参考对应平台的指南.

    注意 第三方平台给你的不一定是APPID,我的意思不是连名字都完全一样,有的平台给的参数多有的给的少,总之都是用于验明身份的.

    2、用户要使用第三方登陆

    这里我们以登录为例.

    在这个流程中服务器(A网站)接受到了用户想要第三方登录的请求,我们使用之前获取的APPID(不同平台叫法和参数可能不同),然后拼接为成第三方平台指定的url

    然后直接重定向到这个url.

    例如在这个例子中我们的地址可能长这个样子:

    www.xxx.com/oauth2.0/authorize?appid=123456&redirect=www.sss.com/login
    

    参数:

    appid 我们的应用对于第三方平台的唯一id
    redirect 用户同意授权后被重定向的地址,一般来说都是本应用的首页或者登录页面,在本例中就是www.sss.com/login这个地址.
    其他参数 根据第三方平会有不同的额外参数.
    

    然后将用户重定向到这个url中,此时用户会跳转到www.xxx.com(因为如果用户授权成功,你总要回调服务商接口,来告诉它,已经授权成功).

    3、用户授权成功

    用户授权成功后,微信就会请求上面redirect参数中的接口地址,带上授权成功的参数code

    在这个例子中这个url看起来是这个样子的

    www.sss.com/login?code=xxxxx
    

    4、获取用户token(令牌)

    此时我们的www.sss.com/login接受到了一个含有code的请求,我们知道这个是一个第三方登录授权后的请求.

    我们再次拼接一个url(不同平台地址规则不同),但是一般来说这个请求会有如下的参数:

    code 用户授权后重定向带回来的code
    appid 应用唯一id
    appsecret 应用对应的密钥
    

    在这个例子中我们请求服务器的url可能是这个样子的:

    www.xxx.com/oauth2/access_token?appid=xxxx&secert=xxxx&code=xxxx
    

    如果一切顺利在这个阶段我们就可以获取第三方平台响应的一个accesstoken,这个accesstoken代表着用户对于这个应用的授权.

    除此以外你还会获取到用户的基本信息例如用户的唯一id之类的,后续的请求用户的信息需要使用accesstoken进行请求。

    5、获取用户基本信息

    利用accesstoken我们向服务器获取了用户的名字,显示在了我们的应用中, 后续的资源获取就是这个模式(不同平台资源获取地址以及方式有可能稍有不同).

    6、补充

    1、微信认证成功后,我会会把accesstoken存放在cookie中,这样不用每次都需要用户去授权认证,而是我们后台去请问微信,这个时候用户是不会感知的。

    2、accesstoken不是一直有效的,它会有过期时间的,就好比微信扫码登陆中accesstoken有效时间是2小时。

    3、那么accesstoken时效,是不是就要用户重新授权登陆了,当然也不是,如果没2小时都要重新授权登陆那体验也太差了。这里会有个叫refresh_token

    它是在你第一次获取accesstoken一起给你的,也就是说如果你的accesstoken时效了,你还可以通过refresh_token去获取用户信息。这么说refresh_token的

    时效时间肯定要比accesstoken,微信扫码登陆refresh_token有效时间是30天

    4、也就是当refresh_token也时效的时候,才会需要用户重新授权登陆。

    具体的可以看看微信扫码登陆的官方文档:网站应用微信登录开发指南


    参考

    1、轻松理解OAuth2.0协议(多图) (非常感谢)

    2、OAuth2.0 知多少(偏实战)



    别人骂我胖,我会生气,因为我心里承认了我胖。别人说我矮,我就会觉得好笑,因为我心里知道我不可能矮。这就是我们为什么会对别人的攻击生气。
    攻我盾者,乃我内心之矛(22)
    
  • 相关阅读:
    UIApplication直接应用
    iOS开发之苹果开发者账号注册申请流程
    iOS开发之蓝牙使用-建立连接的
    Swift3.0 UICollectionView简单使用
    CSS网页菜单
    c#qq发邮件
    多文档界面的实现(DotNetBar的superTabControl)
    CE修改器:外挂制作高级技巧
    MariaDB 库的基本操作
    Python-使用PyQT生成图形界面
  • 原文地址:https://www.cnblogs.com/qdhxhz/p/13337538.html
Copyright © 2020-2023  润新知