Spring Cloud OAuth2 # Access Token中继流程

来源:互联网 发布:网络储存空间 编辑:程序博客网 时间:2024/06/05 11:16

OAuth2RestTemplate

OAuth2ClientContext
AccessTokenRequest

OAuth2AccessTokenSupport
AccessTokenProvider
AccessTokenProviderChain
AuthorizationCodeAccessTokenProvider
ClientCredentialsAccessTokenProvider
ImplicitAccessTokenProvider
ResourceOwnerPasswordAccessTokenProvider

OAuth2ProtectedResourceDetails:当前ResourceServer要保护的资源的信息,也就是security.oauth2.client里面的内容;
AuthorizationCodeResourceDetails
ImplicitResourceDetails
ClientCredentialsResourceDetails:只有这个client_only为true
ResourceOwnerPasswordResourceDetails

ClientTokenServices:用来管理中继时候的调用方的token的
JdbcClientTokenServices:oauth_client_token操作这个数据库表,每个需要中继的节点都需要建立这个表
表结构:oauth_client_token (token_id, token, authentication_id, user_name, client_id)
token_id:accessToken.getValue()
token:SerializationUtils.serialize(accessToken)
authentication_id:md5(authentication#username+resource#clientid+resource#scope)
user_name:authentication#username
client_id:resource#clientid
authentication_id是领域标识,单查和删除都是根据这个字段;

ClientAuthenticationHandler:验证client账户

RequestEnhancer:

  1. 以OAuth2FeignRequestInterceptor为例
  2. 发起请求时,尝试获取access_token,放到请求的header中
  3. 拿到当前OAuth2ClientContext中的OAuth2AccessToken对象,拿到了就放到Header中
  4. 如果拿不到或者拿到了一个过期的OAuth2AccessToken对象,则尝试重新获取一个新的access_token
  5. 重新获取AccessToken的处理流程是AccessTokenProvider的一个特殊的实现AccessTokenProviderChain来处理的,这个AccessTokenProviderChain可以包含多个AccessTokenProvider对象;每一个需要获取OAuth2AccessToken的地方,最方便的方法就是持有如下的变量
private AccessTokenProvider accessTokenProvider = new AccessTokenProviderChain(Arrays            .<AccessTokenProvider> asList(new AuthorizationCodeAccessTokenProvider(),                    new ImplicitAccessTokenProvider(),                    new ResourceOwnerPasswordAccessTokenProvider(),                    new ClientCredentialsAccessTokenProvider()));

然后在想要获取OAuth2AccessToken的地方直接调用其obtainAccessToken方法即可

OAuth2AccessToken obtainableAccessToken;        obtainableAccessToken = accessTokenProvider.obtainAccessToken(resource,                tokenRequest);
  1. AccessTokenProviderChain#obtainAccessToken的处理过程如下,
  2. 如果当前SecurityContextHolder中的Authentication对象是个AnonymousAuthenticationToken的话,抛出异常,获取access_token的流程终止;
  3. 如果将要请求的资源是
阅读全文
0 0