第八章 SpringCloud Oauth2认证中心-基于JWT认证

1.项目概要
这一章节的内容以第七章的代码为基础改造而成 https://github.com/kwang2003/springcloud-study-ch07.git
传统的web应用中,我们通常通过cookie+session机制来保证调用的安全,在没有认证的情况下自动重定向到登录页面或者调用失败页面,而现在整个架构编程微服务模式了,cookie和session机制已经不能很好的满足保护API的需求了,更多的情况下采用token的验证机制,JWT的本质也是一种token。
JWT:JSON Web Token,是JSON风格的轻量级授权和认证规范,可以实现无状态,分布式的web应用授权。JWT的内容由三部分组成,分别是Header,Payload,Signature,三个部分之间通过.分割,举例
xxxxx.yyyyyy.zzzzz
Header
头部Header一般由2个部分组成alg和typ,alg是加密算法,如HMAC或SHA256,typ是token类型,取值为jwt,一个Header的例子
{
"alg": "HS256",
"typ": "JWT"
}
然后对Header部分进行Base64编码,得到第一部分的值
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.{PAYLOAD}.{SIGNATURE}
Payload
内容部分Payload是JWT存储信息的主体,包含三类内容
  • 标准中注册的声明
  • 公共的声明
  • 私有的声明
标准中注册的声明
  • iss:jwt签发者
  • sub:jwt所面向的用户
  • aud:接收jwt的一方
  • exp:jwt的过期时间
  • nbf:定义在什么时间之前该jwt是不可用的
  • iat:jwt的签发时间
  • jti:jwt的唯一标识,主要用作一次性token,避免重放攻击
公共的声明:
可以存放任何信息,根据业务实际需要添加,如用户id,名称等,但不要存放敏感信息
私有的声明:
私有声是提供者和消费者所共同定义的声明,不建议存放敏感信息
举例:定义一个payload:
{ "sub": "1234567890", "name": "John Doe", "admin": true }对其进行Base64编码,得到第二部分
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.{SIGNATURE}
Signature
token的签名部分由三部分组成256签名
var encodedString = base64UrlEncode(header) + '.' + base64UrlEncode(payload);
var signature = HMACSHA256(encodedString, 'secret');
得到最终的token串
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ
2.Oauth2-Server中生成JWT Token
a)通过keytool生成证书
keytool -genkeypair -alias kevin_key -keyalg RSA -keypass 123456 -keystore kevin_key.jks -storepass 123456

查看证书信息:
keytool -list -v -keystore kevin_key.jks -storepass 123456

查看公钥信息
keytool -list -rfc -keystore kevin_key.jks -storepass 123456

b)将生成的kevin_key.jks文件放到oauth2-server工程的srce/main/resources目录下

c)添加jwt相关jar包依赖
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-jwt</artifactId>
</dependency>
d)在OAuth2服务器端配置核心类AuthorizationServerConfiguration中增加jwt token相关配置

3.测试Oauth2服务
出现登录页面,输入用户名:admin 密码;123456

点击Submit按钮,进入用户授权确认页面

点击Approve,跳转到baidu页面,后面携带了code和state参数
根据code换取access_code,注意使用post方法
注意这个code要和上个步骤中获得的code保持一致

用户名输入client,密码是secret,点击确定,可以看到access_token已经是jwt格式的字符了

{"access_token":" eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1MTAxNzQ2MDYsInVzZXJfbmFtZSI6ImFkbWluIiwiYXV0aG9yaXRpZXMiOlsiYWRtaW4iXSwianRpIjoiNTJhOGM5MTUtMTE2OS00YzU5LWI0MmEtZGY4ZDM0Y2QwZWU0IiwiY2xpZW50X2lkIjoiY2xpZW50Iiwic2NvcGUiOlsiYXBwIl19.GecJM-FHApwznyYl-D3IjB0TpjhdhUXfYv782kfS9vdT0VZsu2HN-MGb-N-6Hf0efZ_mmz54IahJaq3KTw251v4L2O5A1r_iMuUP7GXs_qPHAGn3K1b4l-mNnpJdH5hhS5zYIRqOX2a8DXyI4zD7g8BQL-9PiR3kj9k_z9nW8vY9l2_x5Kyoc-sehxxQ5uQHM3xu6DzOwBpbbER7U_NnUwmcz5nS9YyAexSDnBbZAVpQavL2s1yYQVMJ5Dreq2asXHFbeQHXu5UqVbbTFuOgAylbFJ9K-3nsGAKT9NbzqBPRovI3s_X9HgjrzJHAuojBMeK0QMbvYSbUg2HB7MNNJw","token_type":"bearer","expires_in":43199,"scope":"app","user_name":"admin","jti":"52a8c915-1169-4c59-b42a-df8d34cd0ee4"}
4.access_token信息解析
我们通过上个步骤得到的token信息是不可读的,但是因为header,body都是经过base64转码过的,因此我们可以通过Base64将其解码,spring cloud里也提供了jwt相关的工具类帮我们来反解析这个串
package com.pachiraframework.springcloud.oauth2.config;

import org.junit.Test;
import org.springframework.security.jwt.Jwt;
import org.springframework.security.jwt.JwtHelper;

public class JwtTest {
@Test
public void test() {
String token = " eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1MTAxNzQ2MDYsInVzZXJfbmFtZSI6ImFkbWluIiwiYXV0aG9yaXRpZXMiOlsiYWRtaW4iXSwianRpIjoiNTJhOGM5MTUtMTE2OS00YzU5LWI0MmEtZGY4ZDM0Y2QwZWU0IiwiY2xpZW50X2lkIjoiY2xpZW50Iiwic2NvcGUiOlsiYXBwIl19.GecJM-FHApwznyYl-D3IjB0TpjhdhUXfYv782kfS9vdT0VZsu2HN-MGb-N-6Hf0efZ_mmz54IahJaq3KTw251v4L2O5A1r_iMuUP7GXs_qPHAGn3K1b4l-mNnpJdH5hhS5zYIRqOX2a8DXyI4zD7g8BQL-9PiR3kj9k_z9nW8vY9l2_x5Kyoc-sehxxQ5uQHM3xu6DzOwBpbbER7U_NnUwmcz5nS9YyAexSDnBbZAVpQavL2s1yYQVMJ5Dreq2asXHFbeQHXu5UqVbbTFuOgAylbFJ9K-3nsGAKT9NbzqBPRovI3s_X9HgjrzJHAuojBMeK0QMbvYSbUg2HB7MNNJw";
Jwt jwt = JwtHelper.decode(token);
System.out.println(jwt.toString());
}
}

通过这个测试我们可以看出来,token中已经包含了当前用户的信息了,包括我们在accessTokenConvertor()方法中给token中添加的额外信息user_name
  • 2
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
### 回答1: Spring Cloud OAuth2是一个基于Spring Cloud的OAuth2认证和授权框架。它提供了一组工具和库,用于构建安全的分布式系统。Spring Cloud OAuth2支持多种OAuth2授权流程,包括授权码模式、密码模式、客户端模式和简化模式。它还提供了一些可扩展的组件,如令牌存储、用户信息服务和授权服务器。使用Spring Cloud OAuth2,您可以轻松地将OAuth2认证和授权集成到您的应用程序中,从而实现更安全的分布式系统。 ### 回答2: Spring Cloud OAuth2认证是一种集成了OAuth2标准的身份验证框架,它可以用来保护和授权API访问,也可以用于单点登录和资源服务器保护。 与传统的身份验证方式相比,Spring Cloud OAuth2认证的主要优势在于其更为灵活的授权方式,可以支持不同的授权流程,例如授权码、简化流程和密码凭据流程。此外,Spring Cloud OAuth2认证还提供了可定制化的身份验证流程和接口,开发人员可以根据业务需求对其进行定制。 在使用Spring Cloud OAuth2认证时,需要先配置授权服务器,包括定义客户端类型、授权模式等。接着,在客户端应用程序中会添加安全配置,以确保请求可以被身份验证和授权。最后,当用户请求受保护的API时,Spring Cloud OAuth2认证将使用令牌管理器验证用户身份和访问权限,并允许或拒绝请求。 总的来说,Spring Cloud OAuth2认证为开发人员提供了一种安全、灵活和可定制的身份验证和授权框架,可以帮助企业保护他们的API和资源服务器,同时也可以提高用户体验和安全性。 ### 回答3: Spring Cloud OAuth2是基于OAuth2协议的分布式认证和授权框架。OAuth2协议是一种在客户端与服务端之间进行授权委托的协议,它通过令牌(Token)的方式将授权信息传递给客户端或第三方服务。 Spring Cloud OAuth2提供了一系列组件,包括OAuth2认证服务,资源服务器以及客户端工具,为企业微服务架构提供了安全可靠的认证和授权机制。下面分别介绍OAuth2认证服务、资源服务器以及客户端工具的功能和作用。 1. OAuth2认证服务: OAuth2认证服务是指用于管理令牌(Token)的服务。在Spring Cloud OAuth2中,认证服务可以基于内存存储令牌,也可以基于数据库存储令牌。认证服务主要负责令牌的颁发以及令牌的刷新和撤销。 2. 资源服务器: 资源服务器是指受保护的服务提供方,它需要对请求者的身份进行认证和授权才能够提供服务。Spring Cloud OAuth2提供了一套成熟的资源服务管理机制,通过oauth2-resource注解来声明当前服务是资源服务。 3. 客户端工具: 客户端工具是指用于进行OAuth2认证和授权的工具,可以是Web应用,也可以是移动应用。在Spring Cloud OAuth2中,客户端工具可以通过注解的方式来进行OAuth2认证和授权,简化了客户端代码实现过程。 通过Spring Cloud OAuth2框架的应用,我们可以实现企业级的分布式认证和授权,规范了服务之间的安全通信,助力于微服务架构的安全发展。同时也提供了多种服务集成方案,如内存存储和数据库存储等,方便开发者根据实际需求选择合适的方案。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值