当前位置: 首页 > 知识库问答 >
问题:

如何通过承载令牌从keydeport programmaticaly(Spring)获取用户名和uuid?

班玉堂
2023-03-14

我有一个Spring应用程序,它具有keydeport依赖性。前端发送到我的后端承载令牌,我想使用这个令牌从keydeport获取用户名和他的UUID。

这是我的钥匙斗篷配置。

@Configuration
@ComponentScan(
        basePackageClasses = KeycloakSecurityComponents.class,
        excludeFilters = @ComponentScan.Filter(type = FilterType.REGEX, pattern = "org.keycloak.adapters.springsecurity.management.HttpSessionManager"))
@EnableWebSecurity
class KeycloakConfig extends KeycloakWebSecurityConfigurerAdapter {

    @Bean
    public KeycloakConfigResolver keycloakConfigResolver() {
        return new KeycloakSpringBootConfigResolver();
    }

    @Override
    protected SessionAuthenticationStrategy sessionAuthenticationStrategy() {
        return new NullAuthenticatedSessionStrategy();
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) {
        auth.authenticationProvider(keycloakAuthenticationProvider());
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        super.configure(http);
        http
                .csrf().disable()
                .sessionManagement()
                .and()
                .authorizeRequests()
                .antMatchers("/admin/**").hasRole("ADMINS")
                .antMatchers("/user/**").hasRole("USER")
                .anyRequest().permitAll();
    }
}

在这个endpoint中,我得到授权头:

    @PostMapping(value = "/save/{title}")
    @ResponseBody
    public ResponseEntity uploadFile(@RequestParam("file") MultipartFile file, @PathVariable("title") String title, @RequestHeader("Authorization") String authHeader) {
//get user by token?

    }

共有1个答案

胡永逸
2023-03-14

简而言之,我解析公钥和访问令牌以获得AccessToken类,该类包含您所需要的所有内容(AccessToken.getId()和AccessToken)。getPreferredUsername())

@Autowired
private KeycloakSpringBootProperties keycloakProperties;

public String getRealm() {
    return keycloakProperties.getRealm();
}

public String getAuthServerUrl() {
    return keycloakProperties.getAuthServerUrl();
}

public String getRealmUrl() {
    return getAuthServerUrl()
            + "/realms/"
            + getRealm();
}

public String getOpenIdConnectUrl() {
    return getRealmUrl() + "/protocol/openid-connect";
}

public String getOpenIdConnectCertsUrl() {
    return getOpenIdConnectUrl() + "/certs";
}

public AccessToken loadAccessToken(String accessToken) throws TokenNotActiveException, VerificationException, NoSuchFieldException {
    PublicKey publicKey = new KeyCloakRsaKeyLoader().getPublicKeyFromKeyCloak(getOpenIdConnectCertsUrl());
    String realmUrl = keyCloakConnectionProvider.getRealmUrl();
    AccessToken token =
            RSATokenVerifier.verifyToken(
                    accessToken,
                    publicKey,
                    realmUrl,
                    true,
                    true);

    return token;
}
 类似资料:
  • 在Postman中,我可以使用 回调URL Auth URL 客户端ID 我如何使用C#代码做同样的事情?

  • 我正在运行一个Cordova应用程序,它连接到一个承载在Azure上的Web API。我已经使用Azure AD承载身份验证保护了API。当用户试图调用其中一个endpoint时,他会被转发到Azure广告登录页面,输入他的凭据,然后得到令牌。该令牌将添加到API的所有后续请求中。我正在使用mobile apps客户端SDK(cordova-plugin-ms-azure-mobile-apps)

  • 我目前面临以下情况。 通过google APIendpoint通过HttpCall发送Firebase消息: 在这里,我们必须将OAuth2.0与有效的承载令牌一起使用,如本问题中讨论的: 我应该使用什么承载令牌进行Firebase云消息传递测试? 按照这些步骤操作后,我就可以通过谷歌API发送Firebase消息了。 现在,我想通过HttpCall获得无记名令牌,而不需要手动操作操场https:

  • 我目前正在使用Postman来生成承载令牌,我正在自动化测试中使用它。现在,我也想使用Java中的REST Assured来自动化承载令牌生成过程。请帮帮我.谢了。

  • 使用邮递员,我可以毫无问题地获得令牌。如果单击和,我会得到以下代码片段: 当我尝试在Rest Assured中对请求建模时,我得到了一个400错误,但不清楚为什么: 我哪里出了问题很明显吗?是否应该将键/值传递到中?

  • 使用由ADAL.NET使用此方法生成的承载令牌来保护对API的调用。 然而,当我查看API收到的声明时…没有显示为用户唯一的标识符。Nameidentifier声明对于我为其生成令牌的每个用户都是相同的。 在上面的代码中生成的objectid是令牌生成过程中唯一独特的方面,在令牌的API解构造中表示的声明中,这似乎并不重要。