api - 使用 openid-connect 进行身份验证 spa 和 Rest api

标签 api oauth-2.0 single-page-application openid-connect google-openidconnect

我有一个 API 服务器(资源服务器)和多个应用程序、Web GUI (SPA) 和桌面客户端,也许还会有更多。 除了 http 基本身份验证之外,我还想为我的 API 服务器使用 openid-connect。 使用哪个 openid 提供程序应该是可配置的。我自己的、 Facebook 、谷歌... 我只想进行身份验证,我不需要他们的 API。我只需要一些个人资料数据,例如电子邮件或名字。

假设我已将 google 配置为我的 IdP,并且当前正在使用我的 Web GUI (SPA)。我需要登录,没问题,按https://developers.google.com/identity/protocols/OpenIDConnect我将用户重定向到 google,获取授权码,Web Gui (SPA) 从 google 获取 id_token 和 access_token。

到目前为止没问题,但现在 SPA 必须与我的 API 服务器配合使用,并且 API 服务器需要对来自客户端 (WebGui SPA) 的每个请求进行身份验证(因为它是无状态 REST API),并且需要知道哪个请求用户确实这样做了。

A

那么来自 google 的 access_token 是用来访问 google api 的吗?但我也可以将这个 access_token 与每个请求一起传递到我的 api 服务器,并且 api 服务器调用 https://www.googleapis.com/oauth2/v3/tokeninfo?access_token=xxx验证access_token并获取帐户名(邮件)。但这听起来不太对,不是吗?

B

我还有 id_token,我可以验证它,而无需每次调用​​谷歌服务器。那么我是否也可以将 id_token 作为承载者传递给我的 api 服务器的每个请求,并且 api 服务器可以验证 id_token?但根据 openid-connect 规范,access_token 实际上是刚刚传递到 api 服务器的 token ,而 id_token 必须保留在客户端上。 但是 id_token 对我来说就完全没用了,API 服务器需要知道用户是谁,客户端(Web GUI)并不真正关心。

C

或者既然它是我自己的API Server,那么我的API Server实际上是否需要自己实现整个oauth2系统,只是不进行身份验证,而是创建access_token等。所以我会有一个/api/tokensign ,我可以将 google 的 id_token 传递给它,API 验证 id_token 并为我的 WebGUI (SPA) 创建一个 access_token 。这个新的 access_token 可以作为不记名传递给每个 api 请求。根据规范,这实际上听起来是最好的解决方案,但我真的需要自己在我的 API 中实现 oauth2 吗?听起来像是一个沉重的补充,因为 A 和 B 也可以实现。

我的rest-api需要对每个请求进行身份验证,那么A、B、C是正确的方法吗?请不要告诉我这是基于意见的,事实并非如此。 使用 oauth2/openid-connect 进行身份验证的正确方法是什么?

最佳答案

您可以使用上面提到的所有三种方法,但确实需要考虑一些因素。我将根据可用规范对其进行解释。

场景 - 两个系统S1S2

  • S1 - 身份提供商
  • S2 - API 端点

您需要什么 - 信任并使用 S1 颁发的“ token ”来访问 S2

对建议解决方案ABC的说明

A - 验证 S1 为每次调用颁发的 token

这可以使用 RFC7662 来完成- OAuth 2.0 token 自省(introspection)端点。此验证根据规范有效,因此您可以使用 token 验证端点。

此方法的优点是,如果 token 被撤销,效果是即时的。下一个 API 调用将会失败。但确实对性能有影响。您需要额外的验证服务电话。

请注意,您不需要从此验证响应中获取帐户名。它可以从 ID token 中获取,并可用于验证以获得额外的保护。

B - S1 为每次调用颁发的信任 token

现在这种方法是从 RFC6750 扩展而来的。 - OAuth 2.0 授权框架:不记名 token 使用。您确实可以使用 ID token 来对最终用户进行身份验证和授权。这个link包含有关 ID token 用作不记名 token 的很好的解释。

您确实可以使用 MAC 甚至加密来验证 token 的有效性。但请注意使用短期 token 并始终使用 TLS。并注意刷新代币。!因为根据 openID connect 规范,ID token 不是刷新 token 请求的必需项。

C - 联合包装

为此,您可以编写自己的解决方案或使用现有的解决方案(例如:- WSO2 identity server )。该身份服务器将配置为选择您的应用程序(如桌面应用程序或 Web 应用程序等客户端)上的身份提供商。身份服务器将执行必要的重定向并为您提供所需的 token 。但实际上,您需要使用内省(introspection)端点来验证 token 的有效性。

如果你比这个解决方案先行一步,你可以尝试实现一种代码交换机制。您可以将外部的 token 携带交换为系统之一内部颁发的 token (例如:Google 访问 token 到您的内部访问 token )。这种方法的优点是您可以控制验证。此外,由于后续的 token 验证是在内部完成的,因此应该会提高性能。

希望这能解释您的一些疑问。

关于api - 使用 openid-connect 进行身份验证 spa 和 Rest api,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45242249/

相关文章:

ios - 适用于 iOS 应用的谷歌图像搜索 API

javascript - 在 Angular 8 中导入 interactjs 1.7.2 不起作用

cookies - 在 cookie 中存储不记名 token 的安全性

node.js - 使用 Node.js 向用户时间线发送推文

ruby - 为什么在使用 Ruby 执行 Google Fusion Tables API 命令时会出现 401 错误?

android - Google http/oauth2 api 总是为第二个 HTTPRequest 抛出 EOFException

php - 我的概念是否遵循微服务架构?

android - 如何找到我在 Android Studio 中打开的项目的 API 级别?

python - 如何保持 python 3 脚本(Bot)运行

api - 是否有全局范围内的按需照片打印 API?