无状态RESTful API和第三方认证

时间:2013-12-20 02:15:50

标签: authentication web-applications oauth openid

我想使用第三方身份验证(OpenID,可能是OAuth,但我认为OAuth适用于授权),以便用户可以轻松登录。

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

3 个答案:

答案 0 :(得分:9)

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

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

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

  

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

enter image description here

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

回答您的问题:您无需在任何请求中拨打任何第三方服务。这将是非常低效和缓慢的。 OpenID提供程序将返回用户的凭据,您很高兴。

enter image description here

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

答案 1 :(得分:1)

OpenID Connect是一种在OAuth2之上编写的身份验证机制。客户端获得一个承载令牌,它可以在Authorization头中发送每个请求到资源服务器。

此ID令牌是由OpenID提供商签名的JWT。解码后的令牌看起来像这样:

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

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

答案 2 :(得分:1)

我相信Renat Gilmanov和flup的答案都应该对你有用,但我会尽量回答这里提出的问题。

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

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

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

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

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

在某种程度上,如果您正在为本机移动应用程序编写API以进行连接,那么我编写的所有内容都适用。但是你可能不得不跳过一些稍微复杂的箍,以便让用户进行身份验证,因为有些OpenID提供商认为你是通过网络浏览器来的。