文章目录
一、什么是Oauth2
官网:https://oauth.net/2/
wiki:https://en.wikipedia.org/wiki/OAuth
OAuth 2.0 的标准是 RFC 6749 文件(https://tools.ietf.org/html/rfc6749
)。
OAuth(Open Authorization,开放授权)是为用户资源的授权定义了一个安全、开放及简单的标准,第三方无需知道用户的账号及密码,就可获取到用户的授权信息。
OAuth2.0是OAuth协议的延续版本,但不向后兼容OAuth 1.0即完全废止了OAuth1.0
简单说,OAuth 就是一种授权机制。数据的所有者告诉系统,同意授权第三方应用进入系统,获取这些数据。系统从而产生一个短期的进入令牌(token),用来代替密码,供第三方应用使用。
- OAuth2 是一个通用的 web 安全标准,Spring Security 对 OAuth2 有一系列开箱即用的实现。
- OAuth2 标准提供了 4 种授权(颁发访问令牌)和 1 种刷新令牌的方式。
- 资源服务器通过解析 Authorization 头获取访问令牌,对访问令牌进行验证判断是否运行访问受保护资源。
总结:OAuth 2.0 的核心是一种授权机制,主要用来颁发令牌(token)。
OAuth 标准定义角色
OAuth 标准中定义了以下几种角色:
- 资源拥有者(Resource Owner):资源所有者。拥有访问受保护资源权限的实体,即用户。
- 资源服务器(Resource Server): 托管受保护资源的服务器,能够接收和响应持有 access token 的对受保护资源的请求。
- 客户端(Client):即第三方应用,需要访问资源拥有者的受保护资源。
- 授权服务器(Authorization Server): 在对资源所有者及其权限认证完成后向第三方应用颁发 access token。
申请授权流程
(A)第三方应用向资源所有者请求授权。
(B)第三方应用收到授权许可。
(C)第三方应用向授权服务器出示授权许可。
(D)授权服务器验证第三方应用身份和授权许可,颁发访问令牌。
(E)第三方应用持有访问令牌向资源服务器请求受保护资源。
(F)资源服务器验证访问令牌并响应。
以微信授权登录为例
参考微信官方开发平台:https://developers.weixin.qq.com/doc/oplatform/Mobile_App/WeChat_Login/Development_Guide.html
微信公众平台开发——微信授权登录(OAuth2.0)
参考URL: https://www.cnblogs.com/0201zcr/p/5131602.html
微信 OAuth2.0 授权登录让微信用户使用微信身份安全登录第三方应用或网站,在微信用户授权登录已接入微信 OAuth2.0 的第三方应用后,第三方可以获取到用户的接口调用凭证(access_token),通过 access_token 可以进行微信开放平台授权关系接口调用,从而可实现获取微信用户基本开放信息和帮助用户实现基础开放功能等。
微信 OAuth2.0 授权登录目前支持 authorization_code 模式,适用于拥有 server 端的应用授权。该模式整体流程为:
- 用户访问第三方网站,第三方应用需要用户登录验证,用户选择微信授权登录
- 第三方应用发起微信登录授权请求
https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect
参数 | 是否必须 | 说明 |
---|---|---|
appid | 是 | 公众号的唯一标识 |
redirect_uri | 是 | 授权后重定向的回调链接地址 |
response_type | 是 | 返回类型,请填写code |
scope | 是 | 应用授权作用域,snsapi_base 、snsapi_userinfo |
state | 否 | 重定向后会带上state参数,该值会被微信原样返回,我们可以将其进行比对防止攻击或者做用户步骤1访问url保存 |
wechat_redirect | 否 | 直接在微信打开链接,可以不填此参数。做页面302重定向时候,必须带此参数 |
- 微信服务器拉起用户授权确认页面
- 用户授权通过
- 微信发送请求到第三方应用redirctUrl(第2步填写redirct_uri参数),返回凭证code与state(第2步自定义)
http://host/redirct_uri?code=0217a07e9c194dbf539c45c266b2dcfZ&state=state
- 第三方应用获取到code之后,根据code获取accessToken
https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code
参数 | 是否必须 | 说明 |
---|---|---|
appid | 是 | 应用唯一标识,在微信开放平台提交应用审核通过后获得 |
secret | 是 | 应用密钥AppSecret,在微信开放平台提交应用审核通过后获得 |
code | 是 | 填写第一步获取的code参数 |
grant_type | 是 | 填authorization_code |
返回参数
参数 | 说明 |
---|---|
access_token | 接口调用凭证 |
expires_in | access_token接口调用凭证超时时间,单位(秒) |
refresh_token | 用户刷新access_token |
openid | 授权用户唯一标识 |
scope | 用户授权的作用域,使用逗号(,)分隔 |
- 根据accessToken获取用户信息
https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID
返回参数
参数 | 说明 |
---|---|
openid | 普通用户的标识,对当前开发者帐号唯一 |
nickname | 普通用户昵称 |
sex | 普通用户性别,1为男性,2为女性 |
province | 普通用户个人资料填写的省份 |
city | 普通用户个人资料填写的城市 |
country | 国家,如中国为CN |
headimgurl | 用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空 |
privilege | 用户特权信息,json数组,如微信沃卡用户为(chinaunicom) |
unionid | 用户统一标识。针对一个微信开放平台帐号下的应用,同一用户的unionid是唯一的。 |
- 对用户信息进行处理(用户是否第一次登录,保存用户信息,自定义token,session处理等)
- 返回结果(步骤1对应url或者重定向到首页)
至此,微信OAuth2授权登录过程结束。
流程总结为:
- 第三方发起微信授权登录请求,微信用户允许授权第三方应用后,微信会拉起应用或重定向到第三方网站,并且带上授权临时票据code参数;
- 通过code参数加上AppID和AppSecret等,通过API换取access_token;
- 通过access_token进行接口调用,获取用户基本数据资源或帮助用户实现基本操作。
二、OAuth2的原理
这里要先明确几个OAuth2中的几个重要概念:
- resource owner: 拥有被访问资源的用户
- user-agent: 一般来说就是浏览器
- client: 第三方应用
- Authorization server: 认证服务器,用来进行用户认证并颁发token
- Resource server:资源服务器,拥有被访问资源的服务器,需要通过token来确定是否有权限访问
整体的流程就是:
客户应用向授权服务器请求Access Token —> 授权服务器向用户征询意见,是否将权限授予客户应用 —> 用户同意 —> 授权服务器生成颁发Access Token给客户应用 —> 客户应用请求资源服务器 —> 资源服务器验证客户应用的Access Token —> 验证通过,返回数据.
涉及到三个角色:
- 客户应用(请求资源方)
- 授权服务器(生成Access Token并颁发Access Token)
- 资源服务器(验证Access Token,返回资源)
三、oauth 2.0四种授权类型
OAuth 2.0 对于如何颁发令牌的细节,规定得非常详细。具体来说,一共分成四种授权类型(authorization grant),即四种颁发令牌的方式,适用于不同的互联网场景。
OAuth 2.0 规定了四种获得令牌的流程。你可以选择最适合自己的那一种,向第三方应用颁发令牌。
- 授权码(authorization-code)
- 隐藏式(implicit)
- 密码式(password):
- 客户端凭证(client credentials)
【推荐】第一种方式:授权码授权模式(Authorization Code Grant)
授权码(authorization code)方式,指的是第三方应用先申请一个授权码,然后再用该码获取令牌。
这种方式是最常用的流程,安全性也最高,它适用于那些有后端的 Web 应用。授权码通过前端传送,令牌则是储存在后端,而且所有与资源服务器的通信都在后端完成。这样的前后端分离,可以避免令牌泄漏。
第三方应用引导资源所有者前往授权服务器进行授权,完成后引导资源所有者携带授权码会回到第三方应用,通过授权码第三方应用可以获取真正的访问令牌。
第二种方式:隐式授权模式(Implicit Grant)
有些 Web 应用是纯前端应用,没有后端。这时就不能用上面的方式了,必须将令牌储存在前端。RFC 6749 就规定了第二种方式,允许直接向前端颁发令牌。这种方式没有授权码这个中间步骤,所以称为(授权码)“隐藏式”(implicit)。
隐式许可,相对于授权码模式,第三方应用不再需要授权码,而是在资源所有者授权后直接被颁发一个访问令牌。
总结:这种适合那种没有后端服务转发的场景~
第三种方式:密码式(Password Credentials Grant)
如果你高度信任某个应用,RFC 6749 也允许用户把用户名和密码,直接告诉该应用。该应用就使用你的密码,申请令牌,这种方式称为"密码式"(password)。
总结:相当于你把账号密码给了第三方应用,所以使用场景很有限,除非高度信任某个应用。
第四种方式:授权客户端模式(Client Credentials Grant)
最后一种方式是凭证式(client credentials),适用于没有前端的命令行应用,即在命令行下请求令牌。
第一步,A 应用在命令行向 B 发出请求。
https://oauth.b.com/token?
grant_type=client_credentials&
client_id=CLIENT_ID&
client_secret=CLIENT_SECRET
上面 URL 中,grant_type参数等于client_credentials表示采用凭证式,client_id和client_secret用来让 B 确认 A 的身份。
第二步,B 网站验证通过以后,直接返回令牌。
这种方式给出的令牌,是针对第三方应用的,而不是针对用户的,即有可能多个用户共享同一个令牌。
总结:针对第三方应用本身使用,没有客户参与场景。
授权码授权模式(Authorization Code Grant)和客户端凭证模式(Client Credentials Grant)返回对比
总结和使用场景
【IT老齐212】除了授权码,OAuth2其他三种模式用在哪?
视频链接:https://www.bilibili.com/video/BV1KG4y1z77C/
一次搞懂access token在开放平台中的应用
视频链接: https://www.bilibili.com/video/BV1om4y1b7LS/
授权码授权模式(Authorization Code Grant)是主流使用方式,其他模式使用比较少,除非在各自比较特殊场景中使用。
四、SSO、CAS、OAuth、OIDC到底有啥区别?
【IT老齐241】SSO、CAS、OAuth、OIDC到底有啥区别?
原视频链接:https://www.bilibili.com/video/BV1XG411w7DN/
视频作者讲的很清晰,推荐查看~
CAS(Central Authentication Service)
定义:中央认证服务是一种实现单点登录的协议,允许用户通过一个中央身份验证服务器进行身份验证。
功能:用户在CAS服务器上登录后,可以访问所有集成的应用程序,而不需要再次输入凭据。
应用场景:通常用于校园或企业环境,提供统一的身份验证服务。
CAS 关注点的是认证,不是授权,有点淘汰了
OIDC(OpenID Connect)
定义:OpenID Connect是基于OAuth 2.0的身份层协议,提供用户身份验证的功能。
功能:OIDC不仅允许授权,还提供用户身份信息(如用户ID、电子邮件等),使得应用能够验证用户身份。
应用场景:广泛用于Web应用和移动应用的用户身份验证,支持社交登录等功能。
总结
SSO 是一种用户体验设计,允许用户一次登录访问多个应用。
CAS 是实现SSO的一种具体协议。
OAuth 是一种授权协议,允许第三方应用访问用户资源。
OIDC 是在OAuth基础上增加身份验证功能的协议。
五、spring-security-oauth2
oauth2是一种协议规范,spring-security是对他的一种实现。其次,还有shiro实现,自己根据规范编写代码的实现方式。主流的qq,微信等第三方授权登录方式都是基于oauth2实现的。
打开git官网,搜索关键字 Spring Security,有如下图标红的两个项目:
点击 spring-security-oauth git官网提醒:
The latest OAuth 2.0 support is provided by Spring Security. See the OAuth 2.0 Migration Guide for further details.
https://github.com/spring-projects/spring-security/wiki/OAuth-2.0-Migration-Guide
该文档提供了从Spring Security OAuth 2.x迁移到Spring Security 5.2.x的指导,主要针对OAuth 2.0客户端和资源服务器的迁移过程。它涵盖了迁移所需的步骤、注意事项以及最佳实践,以帮助开发者顺利过渡到更新的安全框架。
最新的OAuth 2.0支持是由
Spring Security
提供的。
spring boot Oauth2 开发
Spring Boot 2.0 利用 Spring Security 实现简单的OAuth2.0认证方式1
参考URL: https://www.cnblogs.com/wunaozai/p/9106351.html
Spring Cloud下基于OAUTH2认证授权的实现
参考URL: https://www.iteye.com/blog/wiselyman-2379419
WebSecurityConfigurerAdapter与ResourceServerConfigurerAdapter
参考URL: https://www.jianshu.com/p/fe1194ca8ecd
在微服务开发的过程中,一般会把授权服务器和资源服务器拆分成2个应用程序。
在Spring Cloud需要使用OAUTH2来实现多个微服务的统一认证授权,通过向OAUTH服务发送某个类型的grant type进行集中认证和授权,从而获得access_token,而这个token是受其他微服务信任的,我们在后续的访问可以通过access_token来进行,从而实现了微服务的统一认证授权。
- 第一步,构建spring boot 聚合项目,添加依赖
Spring Security 及 Security 的OAuth2 扩展
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-security</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-oauth2</artifactId>
</dependency>
- 第二步, OAuth 授权服务器配置
使用@EnableAuthorizationServer
定义配置类继承AuthorizationServerConfigurerAdapter
注入authenticationManager、redisConnectionFactory
@Autowired
private AuthenticationManager authenticationManager;
@Autowired
private RedisConnectionFactory redisConnectionFactory;
注入RedisTokenStore 实例:用于令牌存放。token存在redis,默认是在内存
@Bean
public TokenStore tokenStore() {
return new RedisTokenStore(redisConnectionFactory);
}
覆写方法configure,这个非常重要,就是具体配置认证服务细节。
分别从
@Override
public void configure(AuthorizationServerSecurityConfigurer security)
@Override
public void configure(ClientDetailsServiceConfigurer clients)
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints)
- 第三步, Resource服务配置
auth-server提供user信息,所以auth-server也是一个Resource Server
- 自定义类ResourceServerConfiguration 使用@EnableResourceServer注解,开启了一个spring security的filter,这个filter通过一个Oauth2的token进行认证请求
- 实例化私有变量tokenExtractor(BearerTokenExtractor类实例)
OAuth2AuthenticationProcessingFilter中作为filter拦截认证会借助tokenExtractor从request中获取token的值,将其转换为Authentication 对象。 - 覆写 public void onLogoutSuccess ,处理登出是,token删除
@Slf4j
@Configuration
@EnableResourceServer
public class ResourceServerConfiguration extends ResourceServerConfigurerAdapter {
@Autowired
private TokenStore tokenStore;
private BearerTokenExtractor tokenExtractor = new BearerTokenExtractor();
@Override
public void configure(HttpSecurity http) throws Exception {
http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)
.and()
.authorizeRequests()
.antMatchers("/login/**","/oauth/**").permitAll()
// 监控端点内部放行
.requestMatchers(EndpointRequest.toAnyEndpoint()).permitAll()
.anyRequest().authenticated()
.and()
.formLogin().loginPage("/login").permitAll()
.and()
.logout().permitAll()
// /logout退出清除cookie
.addLogoutHandler(new CookieClearingLogoutHandler("token", "remember-me"))
.logoutSuccessHandler(new LogoutSuccessHandler())
.and()
// 认证鉴权错误处理,为了统一异常处理。每个资源服务器都应该加上。
.exceptionHandling()
.accessDeniedHandler(new OpenAccessDeniedHandler())
.authenticationEntryPoint(new OpenAuthenticationEntryPoint())
.and()
.csrf().disable()
// 禁用httpBasic
.httpBasic().disable();
}
public class LogoutSuccessHandler extends SimpleUrlLogoutSuccessHandler {
public LogoutSuccessHandler() {
// 重定向到原地址
this.setUseReferer(true);
}
@Override
public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
try {
// 解密请求头
authentication = tokenExtractor.extract(request);
if(authentication!=null && authentication.getPrincipal()!=null){
String tokenValue = authentication.getPrincipal().toString();
log.debug("revokeToken tokenValue:{}",tokenValue);
// 移除token
tokenStore.removeAccessToken(tokenStore.readAccessToken(tokenValue));
}
}catch (Exception e){
log.error("revokeToken error:{}",e);
}
super.onLogoutSuccess(request, response, authentication);
}
}
}
- 第四步: 自定义类WebSecurityConfigurerAdapter继承WebSecurityConfigurerAdapter
当我们在spring boot引入了spring-security的相关包时,security默认会为我们创建一个默认WebSecurityConfigurerAdapter,他拦截所有的http请求(/**),且这个Order的值是:SecurityProperties.BASIC_AUTH_ORDER。
- 注入 自定义类 UserDetailsServiceImpl (Security用户信息获取实现类)实现接口UserDetailsService(该接口来自 spring security)
spring-security-oauth2 中有一个 ClientDetailsServiceConfigurer,我们可以借助它设置一个数据源。
WebSecurityConfigurerAdapter与ResourceServerConfigurer
参考URL: https://www.jianshu.com/p/fe1194ca8ecd
WebSecurityConfigurerAdapter与ResourceServerConfigurer
我们在用spring boot 配合spring security和oauth2的时候经常会把这两个类都用上。
Java在正常servelet处理http的请求可能会经过很多的filter
而spring security又是怎么处理的呢,详见下图:
从图中可以看出spring security自己有一个叫FilterChainProxy代理类,该类也实现了servlet接口。FilterChainProxy``内部有一个List filterChains,而SecurityFilterChain是一个接口也是一个chain,每个chain里有若干个filter.既然有多个filter chain,那么来了一个http请求,这个请求(通过该请求的url来判断)应该由哪个或者哪些filter chain来进行处理呢?在spring security里一个请只会被一个filter chain进行处理,也就是spring security通过遍历filterChains这个集合时,只要找到能处理该请求的filter chain就不再进行其他的filter chain匹配。如下图:
比如来了一个请求,url是:/foo/**,那么他会被会第一个filter chain处理,后面的两个filter chain会被忽略掉。
当我们在spring boot引入了spring-security的相关包时,security默认会为我们创建一个默认WebSecurityConfigurerAdapter,他拦截所有的http请求(/**),且这个Order的值是:SecurityProperties.BASIC_AUTH_ORDER。**Security默认还会为我们创建一些filter:
每个filter的作用可以在spring security中文档中找到。
当然你可以通过配置文件设置security.basic.enabled=false 来让默认的失效,或者你可以自定义一个并添加@Order值更低的WebSecurityConfigurerAdapter (or WebSecurityConfigurer) 的`@Bean``,比如像下面的代码:
@Order(SecurityProperties.BASIC_AUTH_ORDER - 10)
public class ApplicationConfigurerAdapter extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http.antMatcher("/foo/**")
...;
}
}
如果同时在处理同一个Url(如:/api/**)应该是哪个生效?
WebSecurityConfigurerAdapter与ResourceServerConfigurerAdapter同时在的话且都配置了处理url为:/api/**,默认是后者会生效。我们在写ResourceServerConfigurerAdapter时,基本上会这么写:
为什么是后者生效呢,因为默认的WebSecurityConfigurerAdapter里的@Order值是100(我们可以在该类上可以明确看到@Order(100)),而我们在ResourceServerConfigurerAdapter上添加了@EnableResourceServer注解,这个玩意儿是干什么用的呢?他其中之一就是定义了@Order值为3(该注解里引用了ResourceServerConfiguration,这个类里面定义了Order值).在spring 的体系里Order值越小优先级越高,所以ResourceServerConfigurerAdapter优先级比另外一个更高,他会优先处理,而WebSecurityConfigurerAdapter会失效。
token处理:使用JWT替换默认的token
Springsceurity使用TokenEnhancer和JwtAccessConverter增强jwt令牌原理
参考URL: https://blog.youkuaiyun.com/qq_42654484/article/details/95216037
spring security oauth默认生成的token是uuid,是无意义的,本身并不包含任何信息。
JWT自包含的意思就是,JWT令牌本身是有信息的,拿到令牌后,解析令牌就能拿到包含的信息,不用去存储里取。
Springsecurity默认生成Token的方法是DfaultTokenServices的createAccessToken方法:
createToken的时候首先是使用UUID来生成的,然后在最后一行
accessTokenEnhancer != null采用的是accessTokenEnhancer配置的token生成策略,若为null则直接返回生成的uuid的token
private OAuth2AccessToken createAccessToken(OAuth2Authentication authentication, OAuth2RefreshToken refreshToken) {
DefaultOAuth2AccessToken token = new DefaultOAuth2AccessToken(UUID.randomUUID().toString());
int validitySeconds = this.getAccessTokenValiditySeconds(authentication.getOAuth2Request());
if (validitySeconds > 0) {
token.setExpiration(new Date(System.currentTimeMillis() + (long)validitySeconds * 1000L));
}
token.setRefreshToken(refreshToken);
token.setScope(authentication.getOAuth2Request().getScope());
//这个才是自定义token生成策略的关键
return (OAuth2AccessToken)(this.accessTokenEnhancer != null ? this.accessTokenEnhancer.enhance(token, authentication) : token);
}
该方法做了五件事:
- 使用UUID生成Token
- 判断Token是否过期,如果没过期,就把过期时间设为当前时间加1000s
- 设置刷新令牌
- 设置权限
- 判断是否有增强器,如果有就调用它的enhance方法
对令牌的增强操作就在enhance方法中
要将uuid换成JWT,需要做两件事,使用JWT ,有两个增强器:
1,第一个叫JwtAccessTokenConverter,作用是添加JWT签名,将uuid的token转为jwt,用秘钥签名。
spring security默认在JWT的token中加入了user_name,如果我们需要额外的信息,需要自定义这部分内容。
JwtAccessTokenConverter是我们用来生成token的转换器,所以我们需要配置这里面的部分信息来达到我们的目的。
JwtAccessTokenConverter默认使用DefaultAccessTokenConverter来处理token的生成、装换、获取。DefaultAccessTokenConverter中使用UserAuthenticationConverter来对应处理token与userinfo的获取、转换。因此我们需要重写下UserAuthenticationConverter对应的转换方法就可以
@Override
public Map<String, ?> convertUserAuthentication(Authentication authentication) {
LinkedHashMap response = new LinkedHashMap();
response.put("user_name", authentication.getName());
response.put("name", ((User) authentication.getPrincipal()).getName());
response.put("id", ((User) authentication.getPrincipal()).getId());
response.put("createAt", ((User) authentication.getPrincipal()).getCreateAt());
if (authentication.getAuthorities() != null && !authentication.getAuthorities().isEmpty()) {
response.put("authorities", AuthorityUtils.authorityListToSet(authentication.getAuthorities()));
}
return response;
}
2,第二个叫 TokenEnhancer token增强,作用是往jwt里添加自定义的信息。由于默认生成uuid token的方法是private,所以通过自定义JwtTokenEnhancer extends TokenEnhancerChain往jwt里添加一些自定义的信息
最后在认证服务器AuthenticationServerConfig里,拿到增强器链TokenEnhancerChain,判断系统里这两个增强器是不是空,非空的话把这两个增强器连起来,加到TokenEndpoint 。
下面在配置类中,将TokenEnhancer和JwtAccessConverter加到一个enhancerChain中
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
endpoints
.allowedTokenEndpointRequestMethods(HttpMethod.GET, HttpMethod.POST)
.authenticationManager(authenticationManager)
.approvalStore(approvalStore())
.userDetailsService(userDetailsService)
.tokenServices(createDefaultTokenServices())
.accessTokenConverter(OpenHelper.buildAccessTokenConverter())
.authorizationCodeServices(authorizationCodeServices());
// 自定义确认授权页面
endpoints.pathMapping("/oauth/confirm_access", "/oauth/confirm_access");
// 自定义错误页
endpoints.pathMapping("/oauth/error", "/oauth/error");
// 自定义异常转换类
endpoints.exceptionTranslator(new OpenOAuth2WebResponseExceptionTranslator());
}
总结:自定义OpenTokenEnhancer类继承 TokenEnhancerChain,将实例加入默认DefaultTokenService。
自定义OpenTokenEnhancer类继承 TokenEnhancerChain的作用就是:
通过TokenEnhancerChain增强器链将jwtAccessTokenConverter(转换成jwt)和jwtTokenEnhancer(往里面加内容加信息)连起来。
spring-security和spring-cloud-starter-security有什么关系, spring-cloud-starter-security和spring-cloud-starter-oauth2又是什么关系?
spring-cloud-starter-security和spring-cloud-starter-oauth2
参考URL: https://blog.youkuaiyun.com/qq_30359369/article/details/103329481
spring-cloud-starter-security主要用来认证和授权, 怎么授权呢? spring-cloud-starter-security提供许多拦截器, 当你在登录的时候, 他就把你拦下来检查,看有没有登录信息, 如果没有就不给过, 在requestMapping上, 由于加了需要某某权限才能访问此方法, 于是又被拦下检查, 这次检查有没有需要的权限
spring-cloud-starter-oauth2干涉么的呢? 它用主要来认证, 它只负责发放令牌, 你只要带着它要求的参数, 通过它给的路径去访问它, 他就给你一个令牌, 别的事他不管。
Spring security oauth2认证流程分析
Spring security oauth2认证流程分析
参考URL: https://www.jianshu.com/p/136f3b5e0d3a
参考
视频:OAuth2 OIDC他们之间的关系以及相互关系 通过微信登录原理解析
视频链接:https://www.bilibili.com/video/BV1K84y1Q71D/
一次搞懂access token在开放平台中的应用
视频链接: https://www.bilibili.com/video/BV1om4y1b7LS/