自己的Spring OAuth2服务器以及3rdparty OAuth提供程序


问题内容

在Spring Boot应用程序中,我有一个OAuth2授权/资源服务器。基于此和Spring Security,我已经保护了Spring MVC REST
API端点。

除此之外,我还要基于Twitter,Facebook,Google等第三方OAuth提供程序向REST端点添加身份验证。

在我的应用程序中,我有两个实体- UserSocialUserSocialUser代表社交网络中的用户个人资料。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跳舞。另外,我已经实现了自己的应用程序Neo4jConnectionRepositoryNeo4jUsersConnectionRepository因为我将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为此用户创建 对象并将其放入安全上下文中。如果是这样,请您举例说明如何实现?


问题答案:

因此,您想要实现的是:当客户端将用户重定向到您的授权服务器(授权代码或隐式授予)以获取令牌时,用户可以使用自己喜欢的社交网络登录。

如果我理解正确,您已经使用Twitter(ProviderSignInController)推出了自己的单点登录(SSO)实现,现在您想知道如何在Twitter响应“确定”时生成令牌。

我认为您从错误的角度解决了这个问题:与其建立Twitter客户端并以编程方式生成令牌,不如说是将社交SSO集成到spring-security-
oauth2流程中,实际上是如何在其中集成社交SSO。spring安全。

最后,它是关于您的授权服务器如何保护AuthorizationEndpoint的/oauth/authorize。由于您的授权服务器正常工作,因此您已经有了一个配置类扩展WebSecurityConfigurerAdapter,可以处理/oauth/authorizewith
的安全性formLogin那是您需要集成社交内容的地方。

不必使用Spring Security内置的表单身份验证机制,您必须插入自己的安全性,该安全性要么允许用户使用表单登录,要么与其他提供程序一起启动SSO。
Spring
Security是由许多抽象组成的,但实际上只能归结为每个请求都SecurityContext用一个Authentication对象填充。

身份验证过程完成后,用户将继续/oauth/authorize(同意客户端访问某些范围),并且将按通常的方式交付令牌,而无需通过编程方式生成令牌。

我已经使用SAML(Spring Security SAML扩展)完成了此操作,但是在您的情况下,您应该深入研究Spring
Social项目
,该项目似乎支持所有主要的社交网络。
好消息是您已经有了很多可用的工具,“坏消息”是您必须在一定程度上了解它们的工作方式才能将它们连接在一起。