↓ 跳过正文

Spring OAuth2 Client通过code获取AccessToken

正能量 1 分钟阅读 更新于 2026-10-18

补充 OAuth2 授权码换取令牌流程的上下文,说明重定向地址、PKCE 与错误验证。

Spring OAuth2 Client通过code获取AccessToken:原站配图。

记录一下代码: OAuth2ClientTest.java

@Slf4j
@Component
public class OAuth2ClientTest implements InitializingBean {

    @Autowired
    private ClientRegistrationRepository clientRegistrationRepository;
    @Autowired
    private OAuth2AccessTokenResponseClient<OAuth2AuthorizationCodeGrantRequest> accessTokenResponseClient;

    public OAuth2AccessTokenResponse getAccessToken(String authorizationCode) {

        ClientRegistration renaultClient = clientRegistrationRepository.findByRegistrationId("demo");

        String code=PKCEUtil.generateCodeVerifier();

        Map<String,Object> params= Maps.newHashMap();
       //如果用了PKCE,则记得删除client_secret params.put(PkceParameterNames.CODE_CHALLENGE,PKCEUtil.generateCodeChallenge(code));
        params.put(PkceParameterNames.CODE_VERIFIER,code);
        params.put(PkceParameterNames.CODE_CHALLENGE_METHOD,"S256");

        OAuth2AuthorizationRequest authorizationRequest = OAuth2AuthorizationRequest.authorizationCode()
                .clientId(renaultClient.getClientId())
                .authorizationUri(renaultClient.getProviderDetails().getAuthorizationUri())
                .redirectUri(renaultClient.getRedirectUri())
                .attributes(params)
                .build();

        OAuth2AuthorizationResponse authorizationResponse = OAuth2AuthorizationResponse.success(authorizationCode)
                .redirectUri(renaultClient.getRedirectUri())
                .build();

        OAuth2AuthorizationExchange authorizationExchange = new OAuth2AuthorizationExchange(authorizationRequest, authorizationResponse);

        OAuth2AuthorizationCodeGrantRequest grantRequest = new OAuth2AuthorizationCodeGrantRequest(renaultClient, authorizationExchange);

        log.info(JSONUtil.toJsonStr(grantRequest));
        return accessTokenResponseClient.getTokenResponse(grantRequest);
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        //示例code,实际应该是auth server返回的
        getAccessToken("abc");
    }
}

PKCEUtil.java

public class PKCEUtil {

    private static final SecureRandom SECURE_RANDOM = new SecureRandom();

    public static String generateCodeVerifier() {
        byte[] codeVerifier = new byte[32];
        SECURE_RANDOM.nextBytes(codeVerifier);
        return Base64.encodeBase64URLSafeString(codeVerifier);
    }

    public static String generateCodeChallenge(String codeVerifier) {
        byte[] digest = DigestUtils.sha256(codeVerifier);
        return Base64.encodeBase64URLSafeString(digest);
    }
}

补充阅读
#

补充 OAuth2 授权码换取令牌流程的上下文,说明重定向地址、PKCE 与错误验证。

如何理解与使用
#

授权码需要与相应客户端、回调地址及授权上下文匹配,PKCE 的校验值必须来自同一次授权流程。

验证与边界
#

分别测试正常回调、错误 verifier、重复使用和超时。客户端密钥及令牌应留在可信处理范围,日志不要输出完整凭据。