当前位置: 首页 > 面试题库 >

我可以在颁发访问令牌时包含用户信息吗?

李敏学
2023-03-14
问题内容

我在一些oauth2实现中已经看到了有关授权服务器发出访问令牌时返回的响应的其他信息。我想知道是否有一种方法可以使用spring-security-oauth2来完成。我希望能够在访问令牌响应中包括一些用户权限,以便我的使用中的应用程序无需管理用户权限,但仍可以根据自己的安全上下文设置用户并应用其自身的任何spring-security检查。

  1. 我将如何获得有关访问令牌响应的信息?
  2. 如何在oauth2客户端上拦截该信息并在安全上下文中进行设置?
    我想另一个选择是使用JWT令牌,并与客户端应用程序共享适当的信息,以便它们可以从令牌中解析用户/权限,并在上下文中进行设置。这使我更加不舒服,因为我希望控制哪些客户端应用程序可以访问此信息(仅受信任的应用程序)和AFAIK,只有授权服务器和资源服务器才知道如何解析JWT令牌。

问题答案:

你将需要实现一个自定义TokenEnhancer,如下所示:

public class CustomTokenEnhancer implements TokenEnhancer {

    @Override
    public OAuth2AccessToken enhance(OAuth2AccessToken accessToken, OAuth2Authentication authentication) {
        User user = (User) authentication.getPrincipal();
        final Map<String, Object> additionalInfo = new HashMap<>();

        additionalInfo.put("customInfo", "some_stuff_here");
        additionalInfo.put("authorities", user.getAuthorities());

        ((DefaultOAuth2AccessToken) accessToken).setAdditionalInformation(additionalInfo);

        return accessToken;
    }

}

并将其作为具有相应设置器的Bean添加到你的AuthorizationServerConfigurerAdapter中

@Configuration
@EnableAuthorizationServer
protected static class AuthorizationServerConfiguration extends AuthorizationServerConfigurerAdapter {

    // Some autowired stuff here

    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
        // @formatter:off
        endpoints
            // ...
            .tokenEnhancer(tokenEnhancer());
        // @formatter:on
    }

    @Bean
    @Primary
    public AuthorizationServerTokenServices tokenServices() {
        DefaultTokenServices tokenServices = new DefaultTokenServices();
        // ...
        tokenServices.setTokenEnhancer(tokenEnhancer());
        return tokenServices;
    }

    // Some @Bean here like tokenStore

    @Bean
    public TokenEnhancer tokenEnhancer() {
        return new CustomTokenEnhancer();
    }

}

然后在控制器中(例如)

@RestController
public class MyController {

    @Autowired
    private AuthorizationServerTokenServices tokenServices;

    @RequestMapping(value = "/getSomething", method = RequestMethod.GET)
    public String getSection(OAuth2Authentication authentication) {
        Map<String, Object> additionalInfo = tokenServices.getAccessToken(authentication).getAdditionalInformation();

        String customInfo = (String) additionalInfo.get("customInfo");
        Collection<? extends GrantedAuthority> authorities = (Collection<? extends GrantedAuthority>) additionalInfo.get("authorities");

        // Play with authorities

        return customInfo;
    }

}

我个人使用JDBC TokenStore,所以我的“一些自动装配的东西在这里”对应于某些@Autowired数据源,PasswordEncoder和不对应的东西。



 类似资料:
  • 如果访问令牌请求是有效的且被授权,授权服务器如5.1节所述颁发访问令牌以及可选的刷新令牌。如果请求因客户端身份验证失败或无效,授权服务器如5.2节所述的返回错误响应。 5.1. 成功响应 5.2. 错误响应

  • 使用KeyCloak时,访问令牌与用户信息令牌有何不同? 从OAuth2/OpenIDConnect中,我了解到访问令牌提供了用户已经通过身份验证的信息,您需要使用用户信息令牌来获取关于用户及其配置文件/角色等的更多信息。 当我看到访问令牌时https://jwt.io/而不是用户信息令牌。我能够获得与用户配置文件相同的信息 为什么会这样,使用Keycloak时访问令牌与用户信息令牌有何不同?

  • 我正在使用来自这个github存储库的php oAU2库。 PHP oauth2库 每当我发送刷新令牌时,我都会收到带有旧作用域的新访问令牌。但我想更改使用新访问令牌返回的作用域。 当我第一次使用用户凭据授权类型生成令牌时,我会获取用户支持的作用域并以这种方式存储它们。 其中$scopes是一个数组 例如$scopes=array("ADDUSER "," EDITUSER "," EDITROL

  • 引用的员额: 为什么OAuth v2既有访问令牌又有刷新令牌? 刷新令牌有什么意义?

  • 是否可以使用OAuth 2访问令牌从ForgeRock的OpenAM获取用户详细信息(属于资源所有者的属性)? 我有一个受信任的SPA UI,可以使用资源所有者密码凭据授予类型从OpenAM获取访问令牌。然而,该访问令牌没有提供有关资源所有者的信息。类似地,endpoint没有提供任何信息。 OpenAM似乎有用于列出用户属性的endpoint,但是期望使用JWT作为请求的身份验证手段。 如何从访

  • 我目前正在尝试使用ADFS 2016认证angular 7应用程序(使用angular-oauth2-oidc)。到目前为止,它工作得很好。当我访问应用程序时,我被重定向到ADFS登录页面,在那里输入我的凭据并获得令牌。 现在,当应用程序调用web API时,它在请求头中发送访问令牌。ADFS返回的访问令牌如下所示: 问题是web API必须知道进行调用的用户的ID(因为在应用程序级别定义了一些权