当前位置: 首页 > 知识库问答 >
问题:

拥有Spring OAuth2服务器和3RDParty OAuth提供程序

查飞星
2023-03-14

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

除此之外,我还想基于Twitter、Facebook、Google等第三方OAuth提供商为我的RESTendpoint添加身份验证。

在我的应用程序中,我有两个实体-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);
}

更新:

我已经将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;
        }
    });
}

到目前为止,一切正常。

一个问题是-如何在signinadapter.signin方法中通过我自己的OAuth2授权服务器对用户进行身份验证/授权?

我认为需要为此用户创建oauth2authentication对象,并将其放入安全上下文。我说的对吗?如果是的话,你能给我举个例子吗?

共有1个答案

宦翔
2023-03-14

所以你想要实现的是:当客户端为了获得一个令牌而将用户重定向到你的授权服务器(授权码或隐式授予)时,用户可以使用他喜欢的社交网络进行登录。

如果我没有理解错的话,您已经使用Twitter(ProviderSigninController)推出了自己的单点登录(SSO)实现,现在您需要考虑如何在Twitter响应“OK”时生成令牌。

我认为您错误地理解了这个问题:不是构建您的Twitter客户端并以编程方式生成令牌,而是在spring-security-oauth2流中集成社交SSO(实际上是如何在Spring Security中集成社交SSO)。

最后,它是关于授权服务器如何保护AuthorizationEndpoint:/oauth/authorize。由于授权服务器正常工作,您已经有一个扩展WebSecurityConfigurerAdapter的配置类,该类使用FormLogin处理/OAuth/Authorize的安全性。这就是你需要融入社交的地方。

您不必使用Spring Security内置的表单身份验证机制,而是必须插入您自己的安全性,允许用户使用表单登录,或者使用其他提供程序启动SSO。
Spring Security由一组抽象组成,但它实际上只是为每个请求填充SecurityContext并使用authenticationhtml" target="_blank">对象。

一旦身份验证过程完成,用户将继续/oauth/authorize,同意客户端访问某些作用域,并且令牌将按照通常的方式交付,而不必以编程方式生成令牌。

我已经使用SAML(Spring Security SAML extension)完成了这一工作,但在您的情况下,您应该挖掘Spring Social projects(Spring Security SAML extension),它似乎支持所有主要的即时社交网络。
好消息是您已经有了一系列可用的工具,“坏消息”是您必须了解它们是如何工作的,以便将它们连接在一起。

 类似资料:
  • 我想简化这个过程,并建议用户通过Google/Facebook/Twitter的oAuth提供商在我的API上进行身份验证。 现在我还不清楚它是如何工作的。例如,我的一个想法--Facebook将发布自己的accessToken,并将其传递回我的API。基于此accessToken,我的API将发出自己的accessToken,并将其传递回客户端应用程序(AngularJS)。或者我应该将Face

  • 简介 服务提供器是所有 Laravel 应用程序引导中心。你的应用程序以及 Laravel 的所有核心服务都是通过服务提供器进行引导。 在这里,我们说的「引导」其实是指 注册 ,比如注册服务容器绑定、事件监听器、中间件,甚至是路由的注册。服务提供器是配置你的应用程序的中心。 Laravel 的 config/app.php 文件中有一个 providers 数组。数组中的内容是应用程序要加载的所有

  • 使用 PHP-FPM 有多种方式来配置一个 web 服务器以提供 PHP 服务。传统(并且糟糕的)的方式是使用 Apache 的 mod_php。Mod_php将PHP 绑定到 Apache 自身,但是 Apache 对于该模块功能的管理工作非常糟糕。一旦遇到较大的流量, 就会遭受严重的内存问题。 后来两个新的可选项很快流行起来:mod_fastcgi 和 mod_fcgid。 两者均保持一定数量

  • 简介 服务提供者是所有 Lumen 应用程序启动的中心所在。包括你自己的应用程序,以及所有的 Lumen 核心服务,都是通过服务提供者启动的。 但是,我们所说的「启动」指的是什么?一般而言,我们指的是 注册 事物,包括注册服务容器绑定、事件侦听器、中间件,甚至路由。服务提供者是设置你的应用程序的中心所在。 若你打开 Lumen 的 bootstrap/app.php 文件,你将会看到 $app->

  • 服务提供者是组件和CatLib联系的桥梁。同时也是CatLib启动的中心,所有的服务都是通过服务提供者定义的。 名词定义 组件 组件与CatLib没有任何关系,她们可以独立的运行在不同的框架中。 服务 是由服务提供者将由一个或者多个组件组合而成,并提供一组可以被开发者使用的接口。 容器 CatLib 依赖注入容器。 架构图 创建服务提供者 服务提供者是用来描述一个服务如何为使用者提供服务的,这些关

  • 问题内容: 我来自一个有角的世界,在那里我可以将逻辑提取到服务/工厂,并在控制器中使用它们。 我试图了解如何在React应用程序中实现相同的目标。 假设我有一个可以验证用户密码输入(强度)的组件。它的逻辑非常复杂,因此我不想将其编写在自己的组件中。 我应该在哪里写这个逻辑?在商店中,如果我使用助焊剂?还是有更好的选择? 问题答案: 第一个答案并不反映当前的Container vs Presente