Spring Cloud OAuth2 +JWT
文章目录
前言
提示:这里可以添加本文要记录的大概内容:
例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。
提示:以下是本篇文章正文内容,下面案例可供参考
一、微服务架构下统⼀认证思路
1.1 基于Session的认证⽅式
在服务端生成用户相关的数据保存在session(当前会话中),发送给客户端session_id存放的cookie中,这样用户客户端请求带上session_id就可以验证服务器端是否存在session数据,以完成用户的合法校验,当用户退出系统或session过期销毁时,客户端的session_id也就无效。加粗样式
1.2 基于token的认证⽅式
它的交互流程是用户认证成功后,服务端生成一个token发给客户端,客户端存储token,每次请求带上token,服务端收到token通过验证后即可验证用户身份。
3.两种方式对比
服务端要存储session信息需要占用内存资源,客户端需要支持cookie;基于token的方式一般不需要服务端存储token,并且不限制客户端的存储方式。
示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。
二、OAuth2开放授权协议/标准
2.1 OAuth2
OAuth2是一个开放授权协议,允许用户授权第三方应用访问他们存储在另外的服务提供者上的信息,不需要将用户名和密码提供给第三方应用或分享他们的所有内容。
用户:我们自己
第三方应用:什么网站等
另外服务提供者:QQ、微信
2.2 OAuth2协议角色和流程
使用QQ登录这些功能时候需要提前到QQ平台进行登记的
- 什么网站、app–登记----->QQ平台
- QQ平台会颁发一些参数给网站,后续进行授权登录时需要携带这些参数
1.client_id :客户端id(QQ最终相当于⼀个认证授权服务器,拉勾⽹就相当于⼀个客户端了,所以会给⼀个客户端id),相当于账号
2.secret:相当于密码
资源所有者(Resource Owner):可以理解为⽤户⾃⼰
客户端(Client):我们想登陆的⽹站或应⽤,⽐如拉勾⽹
认证服务器(Authorization Server):可以理解为微信或者QQ
资源服务器(Resource Server):可以理解为微信或者QQ
2.3 什么情况下使用OAuth2
- 第三方授权登录:微信授权登录、QQ授权登录、微博授权登录等,这是典型的 OAuth2 使⽤场景。
- 单点登录的场景:如果项⽬中有很多微服务或者公司内部有很多服务,可以专⻔做⼀个认证中⼼(充当认证平台⻆⾊),所有的服务都要到这个认证中⼼做认证,只做⼀次登录,就可以在多个授权范围内的服务中⾃由串⾏。
2.4 OAuth2颁发Token授权方式
(1)授权码(authorzation-code)
授权码模式使用了回调地址,最复杂的授权方式
(1)资源拥有者打开客户端,客户端要求资源拥有者给予授权,它将浏览器被重定向到授权服务器,重定向时会附加客户端的身份信息。
/uaa/oauth/authorize?
client_id=p2pweb&response_type=code&scope=app&redirect_uri=http://xx.xx/notify**加粗样式**
client_id:客户端接入标识。
response_type:授权码模式固定为code。
scope:客户端权限。
redirect_uri:跳转uri,当授权码申请成功后会跳转到此地址,并在后边带上code参数(授权码).
(2)浏览器出现授权服务器授权页面,之后将用户同意授权
(3)授权服务器将授权码转经浏览器发送给client(通过redirect_uri)
(4)客户端拿着授权码转向授权服务器索要访问access_token
(2) 密码模式
提供用户名+密码换取token令牌:常用的password密码模式(提供用户+密码换取token)
(1)资源拥有者将用户名、密码发送给客户端
(2)客户端拿着资源拥有者的用户名、密码向授权服务器请求令牌(access_token),请求如下:
/uaa/oauth/token?
client_id=p2pweb&client_secret=fgsdgrf&grant_type=password&username=shangsan&password=123456
参数列表如下:
client_id:客户端准入标识。
client_secret:客户端秘钥。
grant_type:授权类型,填写password表示密码模式
username:资源拥有者用户名。
password:资源拥有者密码。
(3)授权服务器将令牌(access_token)发送给client
(3)客户端凭证
/uaa/oauth/token?client_id=p2pweb&client_secret=fdafdag&grant_type=client_credentials
参数列表如下:
client_id:客户端准入标识。
client_secret:客户端秘钥。
grant_type:授权类型,填写client_credentials表示客户端模式
(4) 简化模式
(1)资源拥有者打开客户端,客户端要求资源拥有者给予授权。它将浏览器被重定向到授权服务器,重定向时会附加客户端的身份信息。
(2)浏览器出现向授权服务器授权页面,之后将用户同意授权。
(3)授权服务器将授权码将令牌(access_token)以Hash的形式存放在重定向uri的fargment中发送给浏览 器
/uaa/oauth/authorize?
client_id=p2pweb&response_type=token&scope=app&redirect_uri=http://xx.xx/notify
三、Spring Cloud OAuth2 + JWT 实现
注意:使用OAuth2 解决问题的本质是引入了一个认证授权层,认证授权层链接资源的拥有者,在授权层里面,资源的拥有者可以给第三方应用授权去访问我们某些保护资源。
3.1 JWT
3.1.1 JWT令牌的优点
- JWT基于json,非常方便解析。
- 可以在令牌中自定义丰富的内容,易扩展。
- 通过非对称加密算法及数字签名技术,防止篡改、安全性高。
3.1.2 JWT令牌的结构
JWT令牌由Header、Payload、Signature三部分组成,每部分中间使用点分隔
- header
头部包括令牌的类型(即JWT)及使用的哈希算法(如HMAC SHA256或RSA)。
{ “alg”: “HS256”,
“typ”: “JWT”
}
HS256就是HMAC-SHA256,加密算法使用HMAC,摘要算法使用SHA256。
将生成的jwt令牌第一部分使用Base64还原原始内容如下:
public static void main(String[] args) {
byte[] header = java.util.Base64.getDecoder().decode("eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9");
System.out.println(new String(header));
}
- payload
第二部分是负载,内容也是json对象,他是存放有效信息的地方,它可以存放jwt提供的现成字段。
比如:iss(签发者),exp(过期时间戳), sub(面向的用户)等,也可以自定义字段。
{
“sub”: “1234567890”,
“name”: “456”,
“admin”: true
}
最后将第二部分负载使用Base64Url编码,得到一个字符串就是JWT令牌的第二部分。 - signature
第三部分是签名,此部分用于防篡改。这个部分使用base64url将前两部分进行编码
base64UrlEncode(header):
jwt令牌的第一部分。 base64UrlEncode(payload)
jwt令牌的第二部分。 secret: 签名所使用的密钥。
JWT三个部分只有第三部分是加密的,通过数字签名机制,我们既可以保证数据完整性,也可以对数据来源进行身 份验证。 - 什么是签名?
签名是数字签名,发送方将消息原文使用摘要算法生成摘要,再用私钥对摘要进行加密,生成数字签名。
传输数据时为了保证数据的完整性可以使用数字签名技术:
1、发送方使用私钥对内容进行数字签名
2、将内容附带数字签名发送给对方
3、对方收到内容和数字签名,使用公钥进行验签(相当于解密的过程),如果发现内容不一致则说明传输过程被篡改