Spring Authorization Server授权同意后如何获取授权码
对于一个clientId第一次授权同意后再获取授权码,则不在执行授权同意操作,直接是通过OAuth2AuthorizationCodeRequestAuthenticationProvider验证授权请求操作。
OAuth2AuthorizationCodeRequestAuthenticationProvider
authenticateAuthorizationRequest(验证授权请求操作)
1、构建OAuth2TokenContext,根据OAuth2AuthorizationCodeRequestAuthenticationToken、registeredClient、Scopes。
OAuth2TokenContext tokenContext = createAuthorizationCodeTokenContext(
authorizationCodeRequestAuthentication, registeredClient, null, authorizationRequest.getScopes());
2、通过OAuth2AuthorizationCodeRequestAuthenticationProvider#OAuth2AuthorizationCodeGenerator 生成授权码,生成授权码前判断如果OAuth2TokenContext的tokenType 不为空、并且tokenType的值和“code”不相等,则返回null。否则返回授权码,此授权码是通过Base64.getUrlEncoder().withoutPadding()对96位的随机字节进行base64编码,生成的字符串。
3、判断如果授权码生成为null,则抛出异常
4、构建OAuth2Authorization
OAuth2Authorization authorization = authorizationBuilder(registeredClient, principal, authorizationRequest)
.token(authorizationCode)
.attribute(OAuth2Authorization.AUTHORIZED_SCOPE_ATTRIBUTE_NAME, authorizationRequest.getScopes())
.build();
5、对OAuth2Authorization 进行保存或更新操作。保存或更新到内存或数据库表(oauth2_authorization)中。如果是保存到表中的是先根据Id 查询记录是否存在,但上面构建的OAuth2Authorization 的ID是通过UUID.randomUUID().toString()生成的所以很少存在重复的记录,也就是说对OAuth2Authorization的操作基本上为插入操作。
6、判断请求中的redirectUri是否为空,如果为空获取registeredClient的redirectUri作为转发地址
7、构建OAuth2AuthorizationCodeRequestAuthenticationToken返回。
8、通过redirectUri把授权码code和state拼接在redirectUri后返回:
http://127.0.0.1/oauth2/code?code=TtcrmQQVERZDb5jlgPgId4cxYFO8yBYMq2ABDicdx54c6_9XCu4e09eaXrOVd4GblCav-_c4rbw10Or9eR0aae7pmFJWtgtW-KoiVQjGxvNKTmbQgcsluOJxnx4RnqSN&state=wWxnPj3KQeJYjFZIWZ1e_KvHpZOvlyp8DK9tQczrg6E%3D