在Spring Boot应用程序中,我有一个OAuth2授权/资源服务器。基于此和Spring Security,我已经获得了我的Spring MVC REST API端点。
除此之外,我还想基于第三方OAuth提供商(如Twitter,Facebook,Google)为我的REST端点添加身份验证。
在我的应用程序中,我有两个实体 - User
和SocialUser
。 SocialUser
表示社交网络中的用户个人资料。 User
可以与0 * *关联SocialUsers
。现在我可以在Twitter上验证用户,之后我在我的数据库中创建两条记录 - User和SocialUser。 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);
}
但我不知道如何根据我的Principal
实体创建User
,而且我也不确定这是否是正确的方法。
所以,主要的问题是 - 如何通过我自己的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;
}
});
}
到目前为止,一切都很顺利。
一个问题是 - 如何通过我自己的User
方法中的OAuth2授权服务器对SignInAdapter.signIn
进行身份验证/授权?
我想我需要为这个用户创建OAuth2Authentication
对象并将其放入安全上下文中。我是对的吗?如果是这样,你能否告诉我一个如何实施的例子?
答案 0 :(得分:10)
所以你想要实现的目标是:当客户端将用户重定向到授权服务器(授权代码或隐式授权)以获取令牌时,用户可以使用他最喜欢的社交网络登录。
如果我理解正确,你已经用Twitter(ProviderSignInController
)推出了自己的单点登录(SSO)实现,现在你想知道如何在Twitter响应“OK”时生成令牌。
我认为你错误地解决了问题:不是构建你的Twitter客户端并以编程方式生成令牌,而是将社交SSO集成到spring-security-oauth2的流程中,实际上是如何集成Spring Security的社会SSO。
最后,它是关于授权服务器如何保护AuthorizationEndpoint:/oauth/authorize
。
由于您的授权服务器可以运行,因此您已经有一个扩展WebSecurityConfigurerAdapter
的配置类,它使用/oauth/authorize
来处理formLogin
的安全性。 这就是您需要整合社交内容的地方。
您必须插入自己的安全性,允许用户使用表单登录,或者与其他提供商一起启动SSO,而不是使用Spring Security内置表单身份验证机制。
Spring Security由一堆抽象组成,但它实际上只是为SecurityContext
填充每个请求的Authentication
对象。
验证过程完成后,用户将继续/oauth/authorize
,同意客户端访问某些范围,并且令牌将按照通常的方式进行交付,而无需以编程方式生成令牌。
我使用SAML(Spring Security SAML扩展程序)完成了这项工作,但在您的情况下,您应该挖掘Spring Social projects,它似乎支持开箱即用的所有主要社交网络。
好消息是你已经有了很多工具,“坏消息”是你必须要了解它们在某种程度上是如何工作的,以便将它们连接在一起。
答案 1 :(得分:1)