【问题标题】:Stateless RESTful API and 3rd party authentication无状态 RESTful API 和 3rd 方身份验证
【发布时间】:2014-01-08 19:39:13
【问题描述】:

我想使用第 3 方身份验证(OpenID,也许是 OAuth,但我猜 OAuth 是用于授权)以便用户可以轻松登录。

但是,对每个请求进行身份验证是否意味着即使我不需要任何东西,我也会多次致电第 3 方(例如 Google)?例如,我使用 OpenID 身份验证,但我使用的 API 是内部的(例如 /api/tasks/add)。

【问题讨论】:

  • 授权 != 身份验证。长话短说:登录时,您通常验证用户。在 OAuth 过程中,用户授权第三方访问其(或整个)帐户的某些部分。

标签: authentication web-applications oauth openid


【解决方案1】:

我相信 Renat Gilmanov 和 Flup 的回答对您应该有用,但我会尝试在这里回答所提出的问题。

不,这并不意味着您在每次请求时都联系第 3 方网站。事实上,您不能,因为对于给定的会话,整个 OpenID 过程应该只发生一次(这对用户来说是一个有点烦人的手动步骤)

我将 OpenID 提供商(第 3 方)称为 Google,因为这是您在问题中给出的示例。 身份验证将为您做的唯一一件事就是让 Google 向您保证,提出该特定请求的人也知道他们提供给您的 Google 帐户名的密码。

之后,由您负责跟踪来自同一“人”的请求并将其视为同一帐户。基本上,无论您处理的是用户的其余“会话”信息,您现在都可以假设此会话中的所有请求都来自该用户。

最常见的方法是立即将 cookie 传递给浏览器,其中包含一些您在服务器上跟踪的标识符,并为您确认向您传递该 cookie 的人也是知道密码的人用于该 Google 帐户。另一种选择是发送自定义 HTTP 标头,这在某些方面更可取,但手工操作更棘手。

您可以手动构建所有这些,但我强烈建议您找到一些库代码来尽可能多地为您处理这些。你没有提到你用什么来构建这个 Web 应用程序(事实上,你没有明确地说它是一个 Web 应用程序,我只是从标记问题的方式中收集到),但是有很多选择几乎所有您可能使用的框架或系统。

在某种程度上,如果您正在为要连接的原生移动应用编写 API,那么我写的所有内容都适用。但是您可能需要跳过一些稍微复杂的环节才能让用户进行身份验证,因为一些 OpenID 提供商假设您是通过网络浏览器来的。

【讨论】:

    【解决方案2】:

    OpenID Connect 是一种写在 OAuth2 之上的认证机制。客户端获得一个不记名令牌,它可以在向资源服务器的每个请求中发送一个授权标头。

    此 ID 令牌是 JWT,由 OpenID 提供者签名。解码后的令牌如下所示:

      {
       "iss": "https://server.example.com",
       "sub": "24400320",
       "aud": "s6BhdRkqt3",
       "exp": 1311281970,
       "iat": 1311280970
      }
    

    所以它可以被资源服务器验证,而不需要联系 OpenID 提供者。 OpenID 提供者有一个用户端点,依赖方可以在其中获取令牌中未包含的更详细的用户信息,例如姓名和电子邮件地址。

    【讨论】:

      【解决方案3】:

      让我们先解决理解问题。 OpenID 和 OAuth 有点不同。有一种简单的方法可以记住不同的:

      • OpenID 适用于人类。简单示例:您想跳过无聊的注册步骤,让用户重复使用现有帐户。
      • OAuth 用于服务/机器人。简单示例:您希望您的脚本使用某些用户的数据访问外部 API。

      wikipedia提供了一个简单的解释:

      请注意,对于 OpenID,该过程从应用程序询问开始 用户的身份(通常是 openid URI),而在 在 OAuth 的情况下,应用程序直接请求有限的访问权限 OAuth Token(代客钥匙)用于访问用户的 API(进入房屋) 代表。如果用户可以授予该访问权限,则应用程序可以 检索用于建立配置文件的唯一标识符(身份) 使用 API。

      所以I want to use 3rd party authentication ... that user can login easily. 可能意味着您将使用 OpenID。

      回答您的问题:您无需根据任何请求调用任何第三方服务。这将非常低效和缓慢。 OpenID 提供者将返回用户的凭据,您就可以开始了。

      请确保您已正确识别需求。

      【讨论】:

      • 好的,谢谢,现在我理解了其中的一部分。在无状态应用程序中,我如何记住用户是谁?在像 PassportJS 这样的框架中,返回一个 UserProfile,我是否以某种方式使用它?似乎不安全,任何人都可以获取此信息并像用户一样使用该应用程序?
      • 是的,你是对的。存储原始数据可能有点危险。您可以将该信息作为加密 blob 存储在客户端会话中,以避免对 OpenID 提供程序的频繁请求或使用基于en.wikipedia.org/wiki/Cryptographic_nonce的更复杂的协议@
      猜你喜欢
      • 2020-05-16
      • 2011-11-28
      • 1970-01-01
      • 2015-06-06
      • 1970-01-01
      • 2013-04-24
      • 2013-08-21
      • 2012-12-09
      • 2011-11-12
      相关资源
      最近更新 更多