OAuth 2.0授权认证

39 2023-03-13

定义

OAuth 2.0一个关于授权的开放的网络协议。


原理

用户同意授权给第三方使用系统数据,系统分发一个临时令牌(Token),第三方可通过令牌获取相关数据。


令牌特点:

令牌是短期的,会失效,用户无法修改

令牌可以被数据所有者撤销,会立即失效。

令牌有权限范围(scope)


令牌授权的四种方式:

  • 授权码(authorization-code)
  • 隐藏式(implicit)
  • 密码式(password)
  • 客户端凭证(client credentials)


(1)授权码(authorization-code)

授权码(authorization code)方式,指的是第三方应用先申请一个授权码,然后再用该码获取令牌。

适用场景:安全性最高,它适用于那些有后端的 Web 应用


A网站提供一个链接跳转至B网站

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

response_type:请求类型

client_id:请求设备

redirect_uri:成功后回调地址

scope:授权范围


B站需要用户登录,然后确认是否授权给A站,如果同意则跳转至redirect_uri

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

code就是授权码,拿到授权码后,就可以在客户端后台请求令牌了:

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)

grant_type:AUTHORIZATION_CODE,表示采用的授权方式是授权码,

code:参数是上一步拿到的授权码,

redirect_uri:是令牌颁发后的回调网址。

{    
  "access_token":"ACCESS_TOKEN",
  "expires_in":2592000,
  "refresh_token":"REFRESH_TOKEN",
  "scope":"read",
  "unionid":'unionid',
  "info":{...}
}

其中access_token就是令牌,接下来就可以拿着令牌去获取数据了


(2)隐藏式(implicit)

不通过第三方应用程序的服务器,直接在浏览器中向认证服务器申请令牌,跳过了"授权码"这个步骤,因此得名。所有步骤在浏览器中完成,令牌对访问者是可见的,且客户端不需要认证。

A网站提供一个链接跳转至B网站

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

response_type:token请求类型

client_id:请求设备

redirect_uri:成功后回调地址

scope:授权范围


B站需要用户登录,然后确认是否授权给A站,如果同意则跳转至redirect_uri

https://a.com/callback#token=ACCESS_TOKEN

上面 URL 中,token参数就是令牌.

注意:令牌的位置是 URL 锚点(fragment),而不是查询字符串(querystring),这是因为 OAuth 2.0 允许跳转网址是 HTTP 协议,因此存在"中间人攻击"的风险,而浏览器跳转时,锚点不会发到服务器,就减少了泄漏令牌的风险。


(3)密码式(password)

用户向客户端提供自己的用户名和密码。客户端使用这些信息,向"服务商提供商"索要授权。在这种模式中,用户必须把自己的密码给客户端,但是客户端不得储存密码。适合用户高度信任的应用。


第一步,A 网站要求用户提供 B 网站的用户名和密码。

https://oauth.b.com/token?grant_type=password&username=USERNAME&password=PASSWORD&client_id=CLIENT_ID

grant_type:参数是授权方式,

username:B 的用户名

password:B 的密码

client_id:请求设备


第二步,B 网站验证身份通过后,直接给出令牌。

{    
  "access_token":"ACCESS_TOKEN",
  "expires_in":2592000,
  "refresh_token":"REFRESH_TOKEN",
  "scope":"read",
  "unionid":'unionid',
  "info":{...}
}

注意:这时不需要跳转,而是把令牌放在 JSON 数据里面,作为 HTTP 回应,A 因此拿到令牌。


(4)客户端凭证(client credentials)


指客户端以自己的名义,而不是以用户的名义,向"服务提供商"进行认证。


第一步,A 应用在命令行向 B 发出请求。


https://oauth.b.com/token?grant_type=client_credentials&client_id=CLIENT_ID&client_secret=CLIENT_SECRET

grant_type:client_credentials表示采用凭证式

client_id:请求设备

client_secret:秘钥


第二步,B 网站验证通过以后,直接返回令牌。


{    
  "access_token":"ACCESS_TOKEN",
  "expires_in":2592000,
  "refresh_token":"REFRESH_TOKEN",
  "scope":"read",
  "unionid":'unionid',
  "info":{...}
}

这种方式给出的令牌,是针对第三方应用的,而不是针对用户的,即有可能多个用户共享同一个令牌。



评论

0 条评论
没有更多了..
OBJUI公众号
热门文章
  • 使用Axios+PHP+JWT实现登录认证

    JWT(JSON Web Token),顾名思义就是可以在Web上传输的token,这种token是用JSON格式进行format的。它是一个开源标准(RFC7519),定义了一个紧凑的自包含的方式在不同实体之间安全的用JSON格式传输信息。

  • 使用Echarts画甘特图

    Echarts是一个非常强大的图表库, 下面我们来使用它来画甘特图,

  • Composer实现自动加载

    Composer 是 PHP 的一个依赖管理工具。它允许你申明项目所依赖的代码库,它会在你的项目中为你安装他们。 你正在创建一个项目,你需要一个库来加载各种插件, 你所需要做的就是创建一个 composer.json 文件

  • 分享计算机硬核书单

    分享4本计算机内功心法,想在编程行业更进一步,这4本必须吃透: 《计算机组成原理》 《操作系统》 《计算机网络》 《数据结构与算法》

  • Mysql表锁和PHP文件锁的应用

    锁一般是在高并发,多人同时操作同一个表的时候使用,例如下订单。由于表锁,会影响其他用户使用,所以建议使用文件锁。

  • 完整ASCII码表

    ASCII (American Standard Code for Information Interchange):美国信息交换标准代码是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是最通用的信息交换标准,并等同于国际标准 ISO/IEC 646。

  • Nginx日志按天分割

    nginx日志默认是不分割的,时间一长,日志文件就会很庞大。今天就来通过脚本实现按天切割,废话不多说,直接上代码:

  • Nginx 配置https

    SSL 证书是一种数字证书,它使用 Secure Socket Layer 协议在浏览器和 Web 服务器之间建立一条安全通道,从而实现: 1、数据信息在客户端和服务器之间的加密传输,保证双方传递信息的安全性,不可被第三方窃听; 2、用户可以通过服务器证书验证他所访问的网站是否真实可靠。

  • Linux服务器Rsync结合inotify同步文件

    服务器A:192.168.161.150 (分布服务器)(rsync客户端+inotify) 服务器B:192.168.161.151 (WEB服务器1)(rsync服务端) 服务器C:192.168.161.152 (WEB服务器2)(rsync服务端) 说明:服务器A有文件更新,自动同步到服务器B和C

  • frp内网穿透,ngnix反向代理

    设计思路: 1、域名frp.xxx.com解析到公网IP(112.112.112.112示例IP); 2、公网搭建nginx添加frp.xxx.com反向代理到公网服务器的8080端口; 3、frp服务端配置http监听端口为8080 4、内网的frp客户端负责转发内网服务器的WEB端口到frp服务器的8080端口同时制定只监听frp.xxx.com这个域名。 实现: 一、安装