【问题标题】:External OAuth2 integration with own OAuth2 spring server外部 OAuth2 与自己的 OAuth2 spring 服务器集成
【发布时间】:2015-04-12 02:51:43
【问题描述】:

我正在尝试将 Facebook OAuth2 身份验证与我自己的 OAuth2 服务器集成。为了清楚起见,场景如下:

  • 我有一个 OAuth2 服务器负责对我们的用户进行身份验证。我实现了一个自定义的 AuthenticationProvider 来检查提供的凭据,如果成功则构建一个 UserDetails 对象。
  • 我还有一个 rest-api,它也是一个 ResourceServer(在不同的应用程序中运行)。因此,经过身份验证的用户可以访问我们的 rest-api,从而提供令牌。

令牌信息使用 JDBC 共享。

一切正常,但现在我想添加外部身份验证提供程序,例如 Facebook。

我的问题是:最好的方法是什么?预期流量是多少?在我的脑海中,我会想象这样的事情:

  1. 用户通过 facebook 进行身份验证
  2. Facebook 提供令牌
  3. 用户将令牌发送到我们的 OAuth2 服务器
  4. 我用 facebook 检查令牌的有效性
  5. 我使用身份验证提供程序对用户进行身份验证
  6. 服务器使用我的 OAuth2 服务器颁发的新令牌返回给用户,用户从现在开始将使用该令牌请求资源

这是对的吗?如果是这样,我如何将 facebook 令牌发送到我的 OAuth2 服务器?有什么标准吗?我应该为此弥补新的参数吗?例如,我将需要一些方法来区分 facebook 身份验证与用户/密码身份验证。

我想使用我自己的 AuthenticationProvider 来验证这个 facebook 用户吗?然后返回一个没有密码的 UserDetails 对象似乎很奇怪......

另外,如何注册用户并自动登录?我是否必须公开自己的端点,或者是否也有一些 OAuth2 魔法?

有什么想法吗?

【问题讨论】:

    标签: spring authentication oauth-2.0 external spring-security-oauth2


    【解决方案1】:

    Facebook 有一些非常好的文档,其中包含正确的流程以及您应该如何处理流程。

    https://developers.facebook.com/docs/facebook-login/manually-build-a-login-flow/v2.2

    您在正确的轨道上,我认为 facebook 文档应该有助于解决您可能遇到的任何问题。

    更多信息在这里:

    https://developers.facebook.com/docs/facebook-login/v2.2

    【讨论】:

    • 感谢您的回答。我的问题更多关于如何让我的 OAuth2 服务器知道 Facebook 登录。在客户端方面与 facebook 的交互我了解它是如何工作的。例如,我们的主要 Web 应用程序没有使用 OAuth2 服务器。我们验证令牌并登录客户端。但是现在我们也有一个 OAuth2 服务器,它一定是不同的。我的问题是它是如何制作的。
    • 您从 facebook 获得一个令牌,您可以检查访问令牌并验证您的 app_id、is_valid、user_id 等......并在您的用户表中创建该“用户”。如果您需要对 facebook 做任何事情,那么将该令牌存储在您的数据库中。一旦您检查了令牌并且它是您数据库中的有效用户,您将通过您的 OAuth 服务器生成一个新令牌并将其链接到您的用户。您将使用您为 API 调用生成的此令牌,如果您需要对 FB 进行任何 API 调用,请从数据库中获取 facebook。然后可以使用您的令牌来确定用户的权限。
    • 好的。 app/web/etc 与我的身份验证服务器之间的通信也是对 /oauth/token 的调用?如果是,我应该使用什么参数。这是我现在主要关心的问题。是否有某种标准调用,或者我应该只制作一个并在服务器中处理它?另外,我的 AuthenticationProvider 期望 spring oauth2 提供一些内部结构...
    • 是的,您将使用令牌(不是 facebook)。回想一下,您将在检查 facebook 令牌并确定他们已通过身份验证并且他们所说的身份之后,将创建一个新令牌并将其分配给您的用户表。因此,此令牌应用于查找在每个 REST API 调用中提供的当前用户,并确定该特定用户是否已获得请求的授权。
    • 感谢您所做的一切,但您仍然没有回答问题...这就是我现在对用户进行身份验证的方式 curl -X POST -vu webapp:PASS localhost:8081/oauth/token -H "Accept: application/json " -d "密码=pass&username=user&grant_type=password&scope=read%20write"。我的问题是提供 Facebook 令牌的结构是什么?是不是一定要自己编,在服务器上处理?那是我的问题。我知道该怎么做,我只是想了解最好的或假定的方法。再次感谢!
    猜你喜欢
    • 2018-07-16
    • 2016-04-16
    • 2017-02-19
    • 2016-06-09
    • 1970-01-01
    • 1970-01-01
    • 2019-10-08
    • 2015-03-31
    • 1970-01-01
    相关资源
    最近更新 更多