- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在Spring Boot应用程序中,我有一个OAuth2授权/资源服务器。基于此和Spring Security,我已经保护了Spring MVC REST API端点。
除此之外,我想基于Twitter,Facebook,Google等第三方OAuth提供程序向REST端点添加身份验证。
在我的应用程序中,我有两个实体-User
和SocialUser
。 SocialUser
代表社交网络中的用户个人资料。 User
可以具有0- *关联的SocialUsers
。现在,我可以在Twitter中验证用户身份,然后在数据库中创建两个记录-User和SocialUser。 SocialUser包含Twitter发出的访问/刷新 token 以及来自此社交网络的其他一些个人资料信息。
现在,我不知道如何将通过社交网络创建的该用户与我现有的身份验证\授权流程关联起来。我想为此用户创建自己的(由我自己的OAuth2授权服务器)accessToken并将其提供给客户端。
此外,该用户的User
实体中没有用户名,密码和电子邮件。 而且我也不知道如何手动创建自己的访问 token 并将其发送给客户端以供将来的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
,而且我不确定这是否是正确的方法。
ProviderSignInController
添加到我的应用程序中,并且现在能够通过Twitter执行完整的OAuth跳舞。另外,由于我将Neo4j用作主数据库,因此我实现了自己的
Neo4jConnectionRepository
和
Neo4jUsersConnectionRepository
。
@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
对象,并将其放入安全上下文中。如果是这样,请您举个例子说明如何实现?
最佳答案
因此,您想要实现的目标是:当客户端将用户重定向到您的授权服务器(授权代码或隐式授予)以获取 token 时,用户可以使用自己喜欢的社交网络登录。
如果我理解正确,那么您已经在Twitter(ProviderSignInController
)上推出了自己的单点登录(SSO)实现,现在您想知道如何在Twitter响应“OK”时生成 token 。
我认为您从错误的 Angular 解决了这个问题:与其建立Twitter客户端并以编程方式生成 token ,不如将其整合到spring-security-oauth2流程中,这实际上是如何在其中整合社交SSO。 Spring 安全。
最后,它是关于您的授权服务器如何保护AuthorizationEndpoint的:/oauth/authorize
。
由于授权服务器正常工作,因此您已经拥有一个扩展了WebSecurityConfigurerAdapter
的配置类,该配置类可使用/oauth/authorize
处理formLogin
的安全性。 这是您需要集成社交内容的地方。
不必使用Spring Security内置的表单例份验证机制,您将必须插入自己的安全性,该安全性要么允许用户使用表单登录,要么与其他提供程序一起启动SSO。
Spring Security是由许多抽象组成的,但实际上归结为每个请求都用SecurityContext
对象填充Authentication
。
身份验证过程完成后,用户将继续/oauth/authorize
,同意客户端访问某些范围,并且 token 将按通常的方式交付,而您无需以编程方式生成 token 。
我已经使用SAML(Spring Security SAML扩展名)完成了此操作,但是在您的情况下,您应该挖掘Spring Social projects,它似乎支持开箱即用的所有主要社交网络。
好消息是您已经有了很多可用的工具,“坏消息”是您必须在一定程度上了解它们的工作方式才能将它们组合在一起。
关于spring-mvc - 自己的Spring OAuth2服务器以及3rdparty OAuth提供程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29734305/
我是一名优秀的程序员,十分优秀!