OAuth 2.0授权认证
669 2023年04月04日 前端,后端定义
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":{...}
}
这种方式给出的令牌,是针对第三方应用的,而不是针对用户的,即有可能多个用户共享同一个令牌。
-
使用Echarts画甘特图
Echarts是一个非常强大的图表库, 下面我们来使用它来画甘特图,
-
go语言怎么连接mysql,并实现增删改查
要使用Go语言连接MySQL,需要使用第三方库。常用的库包括: 这里以go-sql-driver/mysql为 […]
-
beego实现模块化开发
Beego 框架可以通过模块化开发来提高项目的可维护性和可扩展性,可以将一个大型的应用划分为多个模块,每个模块独立维护,有自己的控制器、视图和模型等。
-
Beego实现JWT
Beego是一个基于Go语言的Web框架,实现JWT认证可以通过beego的中间件机制来实现,下面是一个简单的 […]
-
使用Axios+PHP+JWT实现登录认证
JWT(JSON Web Token),顾名思义就是可以在Web上传输的token,这种token是用JSON格式进行format的。它是一个开源标准(RFC7519),定义了一个紧凑的自包含的方式在不同实体之间安全的用JSON格式传输信息。
-
PHP解决雪花算法ID在前端精度丢失的问题
雪花算法(Snowflake)是一种用于生成全局唯一ID的算法,其基本思路是结合时间戳、机器ID、租约ID和序列号生成一个64位的数据,从而保证ID的唯一性。 雪花算法的生成过程如下:
-
虚拟滚动实现页面百万数据滚动
1.概念 虚拟滚动是一种优化长列表性能的技术,它通过按需渲染的方式,只渲染可见部分的列表项,而不是渲染整个列表 […]
-
go实现MD5
在这个示例中,我们使用了Go标准库中的crypto/md5包来计算一个字符串的MD5值。首先,我们将字符串转换 […]
-
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
-
JavaScript实现滑动验证码
滑动验证码(也叫做滑动拼图验证码)是一种用户交互形式的验证码,通常用于网页或移动应用的登录、注册或敏感操作。其 […]