【问题标题】:Spring Security oauth2 client - How does one obtain a JWT tokenSpring Security oauth2 客户端 - 如何获取 JWT 令牌
【发布时间】:2018-08-02 00:22:58
【问题描述】:

我正在尝试使用 spring-security-oauth2-clientspring-security-oauth2-jose 对 Azure AD 进行身份验证并获取 JWT 令牌。 登录部分有效,但我收到的令牌不是 JWT。这是我的配置:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

@Autowired
private OAuth2UserService<OidcUserRequest, OidcUser> oidcUserService;


@Override
protected void configure(HttpSecurity http) throws Exception {
    http
    .authorizeRequests()
    .anyRequest()
    .authenticated()
    .and()
    .oauth2Login()
    .loginPage("/oauth2/authorization/azure")
    .userInfoEndpoint()
    .oidcUserService(oidcUserService);
}

}

身份验证后,我从安全上下文中检索令牌,如下所示:

OAuth2AuthenticationToken authentication = (OAuth2AuthenticationToken) 
SecurityContextHolder.getContext().getAuthentication();
OAuth2AccessToken accessToken = authorizedClientService.loadAuthorizedClient(
            authentication.getAuthorizedClientRegistrationId()
            ,authentication.getName()
            ).getAccessToken();

我得到一个不记名令牌,如下所示:

"AQABAAAAAADXzZ3ifr-GRbDT45zNSEFElTInSJQ19I2zONWkrBPgoKf8MCYL_z_IzU2lmF_ZadgBMdCr337faL0bpqHAzmFhsxq8peWUX7iYeTLbmcHDIdCR617VSKKHISLn_AiXhNr9rF6AMSrQTzdV2mKhEVlycTXlHUsZkA-gMA4z4FQFQMYkFNcLKqr7b-NewnV07lbG55joRIkcCMDrM1s4X8mRcJpRF6ek1yNSpveFmlbkrt3cXPUqtDe5EWI_5gfuGEVIon57LFLos_JtcQWSL6CTrUlY8EuF8MVuwJpTNG3OR80ikK7ycH_dXFCYmYDRrtTbFkf3R61aDSnqEUe2IIl2T8QdqWqH65ykSVooG6uIi5KsRK9zXPRuRuC_XC5w6SCcGionQYIgSEp-kCtIzlfHIBRK2o_CpjYVMBdmbfIkCvFoTGGGAvpOP1_MkgVeBiQzYFg8m_dn_roXFF17oBhCdYrZ2Y41_-GngLU3VJj4ltFIxzRziH6CZ2aFl1N3MwzIUcTiN6Ci0oyODTsSNDPc2zvxg609SjEqrO-6Xp0LMEwiOgY5L5rrcLA5d4LN-Xq9NiG0KqybZPU7wW0AHNA2Nw7bSg1Cle0ReaBU4ANbkjHxYeQJf65-ONNMGdfkV8xlKtRXZoiOBFip87Z72cS4NjLjM3x9_Qk9MQ5eGQTNj4fHCzJp9ukcjQ1MSUol_VIgAA "

然后被 Microsoft Graph API 拒绝。非常感谢任何帮助或建议。

【问题讨论】:

  • 您的 Bearer 令牌看起来不像 access_token。它看起来像authorization_code。请验证。

标签: spring-security microsoft-graph-api


【解决方案1】:

您还可以从 Authentication 对象中获取 id 令牌。您需要将 authentication.principal 转换为 OidcUser。 OidcUser 为您提供用户的完整详细信息。

            OAuth2AuthenticationToken oauthToken = (OAuth2AuthenticationToken) authentication;
        OAuth2AuthorizedClient client = 
                clientService.loadAuthorizedClient(
                        oauthToken.getAuthorizedClientRegistrationId(),
                        oauthToken.getName());


    if (authentication.getPrincipal() instanceof OidcUser) {
            OidcUser principal = ((OidcUser) authentication.getPrincipal());
            idToken = principal.getIdToken().getTokenValue();
        }

【讨论】:

  • 这正是在 OIDC 中提取令牌的方式!
【解决方案2】:

我找到了解决方案。你得到的是返回的授权码。要获取访问令牌,请使用以下命令:

public void getToken(OAuth2AuthenticationToken oAuth2AuthenticationToken, @AuthenticationPrincipal(expression = "idToken") OidcIdToken idToken) {

System.out.println(idToken);

}

【讨论】:

  • @EdouardZerbo:我需要完全相同的东西。但是我该如何调用这个方法呢?
【解决方案3】:

根据@govind 的回答,这是在现代函数式 Java 中获取 OIDC 令牌的方法:

public Optional<String> getCurrentToken() {
    return Optional.ofNullable(SecurityContextHolder.getContext())
        .map(SecurityContext::getAuthentication)
        .map(Authentication::getPrincipal)
        .filter(OidcUser.class::isInstance)
        .map(OidcUser.class::cast)
        .map(OidcUser::getIdToken)
        .map(OidcIdToken::getTokenValue);
}

【讨论】:

    猜你喜欢
    • 2019-10-02
    • 2015-06-02
    • 2016-08-12
    • 2019-03-03
    • 2020-11-24
    • 2012-10-22
    • 1970-01-01
    • 2013-06-20
    • 2015-09-19
    相关资源
    最近更新 更多