【发布时间】:2015-06-26 09:02:43
【问题描述】:
在 Spring Boot 应用程序中,我有一个 OAuth2 授权/资源服务器。基于此和 Spring Security,我已经保护了我的 Spring MVC REST API 端点。
除此之外,我还想为我的 REST 端点添加基于 Twitter、Facebook、Google 等第三方 OAuth 提供程序的身份验证。
在我的应用程序中,我有两个实体 - User 和 SocialUser。 SocialUser 代表社交网络中的用户资料。 User 可以有 0-* 关联 SocialUsers。现在我可以在 Twitter 中对用户进行身份验证,然后在我的数据库中创建两条记录——用户和社交用户。 SocialUser 包含 Twitter 发布的访问/刷新令牌以及来自该社交网络的一些其他个人资料信息。
现在我不知道如何将这个从社交网络创建的用户与我现有的身份验证\授权流程联系起来。对于这个用户,我想创建自己的(通过我自己的 OAuth2 授权服务器)accessToken 并将其提供给客户端。
另外,该用户的User 实体中没有用户名、密码和电子邮件。 而且我不知道如何手动创建自己的访问令牌并将其发送到用于未来 API 调用的客户端。
我找到了一些例子:
@Inject
private TokenEndpoint tokenEndpoint;
public String createAccessToken(User user) {
HashMap<String, String> parameters = new HashMap<String, String>();
parameters.put("client_id", "appid");
parameters.put("client_secret", "myOAuthSecret");
parameters.put("grant_type", "password");
parameters.put("password", user.getPassword());
parameters.put("scope", "read write");
parameters.put("username", user.getUsername());
// principal ??
return tokenEndpoint.getAccessToken(principal, parameters);
}
但我不知道如何根据我的 User 实体创建 Principal,而且我不确定这是正确的方法。
所以,主要问题是 - 如何通过我自己的 OAuth 服务器为这个新用户手动生成这个新令牌?
请告诉我如何正确实施。谢谢。
更新:
我已将ProviderSignInController 添加到我的应用程序中,并且现在能够使用 Twitter 执行完整的 OAuth 舞蹈。另外,我实现了自己的Neo4jConnectionRepository 和Neo4jUsersConnectionRepository,因为我使用 Neo4j 作为主数据库。
@Bean
public ProviderSignInController providerSignInController() {
return new ProviderSignInController(socialAuthenticationServiceLocator, usersConnectionRepository, new SignInAdapter() {
@Override
public String signIn(String userId, Connection<?> connection, NativeWebRequest request) {
System.out.println("User ID: " + userId + " social display name: " + connection.getDisplayName());
return null;
}
});
}
到目前为止,一切正常。
一个问题是 - 如何在SignInAdapter.signIn 方法中通过我自己的OAuth2 授权服务器对User 进行身份验证/授权?
我想我需要为此用户创建OAuth2Authentication 对象并将其放入安全上下文中。我说的对吗?如果是这样,你能告诉我一个如何实现的例子吗?
【问题讨论】:
-
如果我理解正确:您有一个提供您自己的令牌的授权服务器,一些资源服务器受这些令牌的保护。您的授权服务器根据自己的用户数据库对您的用户进行身份验证,并且您想添加单点登录 (SSO) 以通过第三方对您的用户进行身份验证?
-
是的,你是对的。第三方是例如 Google、Facebook、Yahoo OAuth 提供商
-
我也有同样的要求。你得到这个工作了吗?你能提供更多细节吗?我想知道你在
SignInAdapter中究竟做了什么? -
我从自己的 OAuth2 服务器转移到了 JWT
标签: spring-mvc spring-security oauth-2.0 spring-social spring-security-oauth2