OAuth协议入门之授权码模式

最近在业务中接触到了OAuth协议,之前没有遇见过,记录一下

一、什么是OAuth协议

OAuth(开放授权)是一个开放授权标准,即用户授权第三方移动应用访问他们存储在另外的服务提供者上的信息,而不需要用户提供自己的账号密码,只需提供一个令牌。

二、结合具体例子,理解OAuth

想必大家都遇到过这样一个场景,登录一个网站不想输入自己的账号密码,而是使用QQ,微信进行授权登录

以上就一个OAuth授权的大致流程,这样做有什么好处呢?

(1)用户可以不用注册帐号,就可登录网站使用资源,且不用担心帐号失窃,因为这个授权过程是安全的

(2)方便了用户,网站就可以更容易获取用户量

(3)QQ,微信将海量的数据开放给第三方网站,既是为其他小企业做的贡献,也增大了自身的知名度

以上三方都获得了便利

三、OAuth授权有哪几种模式

了解授权模式之前,需先理解以下名词:

        Third-party application:第三方应用程序,又可称作客户端,比如打开慕课网、知乎,使用第三方登录的时候,这时候慕课网,知乎就是客户端。

        HTTP service:HTTP服务提供商,本文中简称"服务提供商",即上例的微信,QQ等。

        Resource Owner:资源所有者,本文中又称"用户"(user),即登录用户。

        Authorization server:认证服务器,即服务提供商专门用来处理认证的服务器。

       Resource server:资源服务器,即服务提供商存放用户生成的资源的服务器。它与认证服务器,可以是同一台服务器,也可以是不同的服务器。

OAuth有以下四种模式:

  • 授权码授权模式(Authorization code Grant)
  • 隐式授权模式(Implicit Grant)
  • 密码模式(Resource Owner Password Credentials Grant) 
  • 客户端凭证模式(Client Credentials Grant)

下面主要讲解一下最常用的授权码模式

 注意,不管哪一种授权方式,客户端申请令牌之前,都必须先到系统备案(向服务提供商备案),说明自己的身份,然后会拿到两个身份识别码:客户端 ID(client ID)和客户端密钥(client secret)。这是为了防止令牌被滥用,没有备案过的第三方应用,是不会拿到令牌的。

授权码授权模式:

这种方式是最常用的流程,安全性也最高,它适用于那些有后端的 Web 应用。授权码通过前端传送,令牌则是储存在后端,而且所有与资源服务器的通信都在后端完成。这样的前后端分离,可以避免令牌泄漏。

这里假设第三方平台为A,授权服务器为B:

(1)其中第2步会把重定向的地址返回给客户端,重定向到授权服务器一般会携带以下几个参数

https://b.com/oauth/authorize?response_type=code&client_id=CLIENT_ID&
redirect_uri=CALLBACK_URL&scope=read

 上面 URL 中,response_type参数表示要求返回授权码(code),client_id参数让 B 知道是谁在请求,redirect_uri参数是 B 接受或拒绝请求后的跳转网址,scope参数表示要求的授权范围(这里是只读)。这些参数一般都会和服务提供商约定好。

(2)跳转到B 网站后会要求用户登录,然后询问用户否同意给予 A 网站授权。用户表示同意,这时 B 网站就会跳回redirect_uri参数指定的A网址。跳转时,会传回一个授权码,就像下面这样。

https://a.com/callback?code=AUTHORIZATION_CODE

(3)A 网站拿到授权码以后,就可以在后端,向 B 网站请求令牌。

https://b.com/oauth/token?client_id=CLIENT_ID&client_secret=CLIENT_SECRET&
grant_type=authorization_code&code=AUTHORIZATION_CODE&redirect_uri=CALLBACK_URL

同样的也会携带部分参数:client_id参数和client_secret参数用来让 B 确认 A 的身份(client_secret参数是保密的,因此只能在A后端发请求),grant_type参数的值是AUTHORIZATION_CODE,表示采用的授权方式是授权码,code参数是上一步拿到的授权码,redirect_uri参数是令牌颁发后的回调网址,也就是A登录成功后的首页地址。

(4)B 网站收到请求以后,就会颁发令牌。具体做法是向redirect_uri指定的网址,发送一段 数据,数据中包含一些必要的信息和Token,类似下面这样

{
"access_token":"ACCESS_TOKEN",
"token_type":"bearer",
"expires_in":2592000,
"refresh_token":"REFRESH_TOKEN",
"scope":"read",
"uid":100101,
"info":{...}
}

(5)A拿到这些信息后,以后请求B的资源服务器,只需携带上token,就可以获取B授权访问的数据啦,而B每次都会校验token是否合法以及是否有效


参考文章:

OAuth2.0的四种授权模式 - alittlesmile - 博客园

OAuth2.0协议 - Chars-D - 博客园

OAuth 2.0 的四种方式 - 阮一峰的网络日志

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值