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

如何从OAuth2授权服务器/用户端点获取自定义用户信息

锺星洲
2023-03-14
问题内容

我有一个配置有@EnableResourceServer注释的资源服务器,它通过user-info-uri参数引用授权服务器,如下所示:

security:
  oauth2:
    resource:
      user-info-uri: http://localhost:9001/user

授权服务器/用户端点返回其扩展名,org.springframework.security.core.userdetails.User例如带有电子邮件:

{  
   "password":null,
   "username":"myuser",
    ...
   "email":"me@company.com"
}

每当访问某些资源服务器端点时,Spring都会通过调用授权服务器的/user端点来验证幕后的访问令牌,并且实际上会获取丰富的用户信息(其中包含例如电子邮件信息,我已经使用Wireshark进行了验证)。

所以问题是,如何在不显式第二次调用授权服务器/user端点的情况下获取此自定义用户信息。授权后,Spring是否将其存储在资源服务器上的本地位置?如果没有可用的现成的东西,实现这种用户信息存储的最佳方法是什么?


问题答案:

解决方案是自定义的实现 UserInfoTokenServices

只需将你的自定义实现提供为Bean,它将使用它而不是默认的实现。

在此UserInfoTokenServices内部,你可以构建所需的对象principal

此UserInfoTokenServices用于从/users授权服务器的端点的响应中提取UserDetails 。如你所见

private Object getPrincipal(Map<String, Object> map) {
    for (String key : PRINCIPAL_KEYS) {
        if (map.containsKey(key)) {
            return map.get(key);
        }
    }
    return "unknown";
}

PRINCIPAL_KEYS默认情况下,仅提取中指定的属性。那正是你的问题。你不仅要提取用户名或你的属性命名的内容,还需要提取更多信息。因此,寻找更多的钥匙。

private Object getPrincipal(Map<String, Object> map) {
    MyUserDetails myUserDetails = new myUserDetails();
    for (String key : PRINCIPAL_KEYS) {
        if (map.containsKey(key)) {
            myUserDetails.setUserName(map.get(key));
        }
    }
    if( map.containsKey("email") {
        myUserDetails.setEmail(map.get("email"));
    }
    //and so on..
    return myUserDetails;
}

Wiring:

@Autowired
private ResourceServerProperties sso;

@Bean
public ResourceServerTokenServices myUserInfoTokenServices() {
    return new MyUserInfoTokenServices(sso.getUserInfoUri(), sso.getClientId());
}


 类似资料:
  • 我通过spring security oauth2实现了oauth2授权服务器,并使用来存储访问令牌,然后我需要为当前访问令牌提供控制器,以便oauth2客户端获取用户信息, 如下: 但我不知道如何获取用户信息?

  • 我有2个应用程序运行,一个是资源服务器,我有需要认证的信息,以查看文本。然后我有授权服务器提供令牌。现在我可以使用postman或Insomnia,添加auth_url、token_url、client_id、client_secret并获得令牌。我将令牌添加到header,并使用header向资源服务器执行get请求,它工作得很好。 我想被重定向到: 本地主机:9001/登录 我用inmemor

  • 我有一个富网络(基于反应)前端应用程序,它将请求发送到后端资源服务器应用程序。请求在头中与JWT一起发送以进行身份验证。我的设置对Okta授权服务器进行身份验证,并从单独的服务中检索组/授权。 我将后端服务器设置为Springboot应用程序,带有Spring Security Oauth2资源服务器 有了这个设置,我可以使用JwkTokenStore实现来验证JWT令牌(它在内部使用JwkVer

  • 我正在使用PHP Google API客户端库使用OAuth2从Google帐户检索用户信息。然而,尽管谷歌的文档中指出,我似乎无法访问用户的国家或时区信息,即使令牌成功返回,并且所有其他信息都可以从范围中获得。 我在这里使用了int heir库提供的示例代码,如果我在该文件的第49行上var_dump($user),我将获得以下输出(出于隐私考虑进行编辑): 正如您所见,没有可用的时区或国家信息

  • 我在下面设置Spring配置: 和Maven设置如下:

  • 尝试使用 Spring 授权服务器实现 OAuth2 协议。使用以下配置创建了一个简单的应用程序。 调用以下endpoint时: 我得到这些: 我正在尝试通过身份验证并尝试遵循此文档。我尝试了多个电话,其中之一是: 我大部分时间都是带着不同的信息返回401。我真的想不出在哪里可以找到一些带有示例的文档,因为我能够找到的示例对我的用例没有什么帮助。我不完全理解如果客户端是前端应用程序,我将如何验证和