【发布时间】:2018-03-22 18:07:22
【问题描述】:
我正在使用 OIDC 和 OAuth 2.0(使用 Auth0)构建一个系统,但我不确定如何正确使用 id_token 和 access_token。或者更确切地说,我对在我的设置中为各种服务分配哪些角色感到困惑。
我有一个完全静态的前端应用程序(单页应用程序,HTML + JS,无后端),可确保使用针对 Auth0 的隐式流程对用户进行身份验证。然后前端应用程序从我也在构建的 API 中获取数据。
现在,哪个是正确的?
- 前端 SPA 是 OAuth 客户端应用程序
- 我的 API 服务是 OAuth 资源服务器
...或:
- 前端和我的 API 服务都是 客户端应用程序
如果我的前端和后端 API 都可以被视为客户端,我认为在从前端到后端的请求中使用 id_token 作为不记名令牌并没有真正的危害 - 这很有吸引力,因为这样我就可以简单地验证后端的签名令牌,我有我需要的用户的所有信息。但是,如果我的 API 被认为是 资源服务器,我可能应该使用 access_token,但是我必须在每个 API 请求上连接到 Auth0 的服务器以验证令牌并获取基本用户信息,不是吗?
我读过this,这似乎表明access_token 是与我的API 一起使用的唯一有效令牌。但就像我说的,我不确定各个服务的角色。并且使用id_token 很诱人,因为它不需要后端的网络连接,并且包含我需要提取正确数据的信息。
解决这个问题的正确方法是什么?
【问题讨论】:
-
我在 Auth0 论坛上得到了非常可靠的反馈:community.auth0.com/questions/10010/…
-
考虑将论坛回复转换为此处的答案,这将有助于我们其他人在同一条船上:-)
-
替代视图也是有效的,IMO。想象一下,您使用您的 Google 帐户登录您的应用程序。你得到一个 id_token 和一个 access_token。很明显,您使用 id_token 对您的应用进行身份验证,并使用 access_token 调用 Google API。 ID 令牌仅证明您已登录;它不允许您的应用代表您调用 Google API。另一方面,“你的应用”中的 API 服务没有被明确地单独授权为资源服务器——它们同样是“你的应用”的一部分,无论它们是通过 HTTP 还是本地方法调用访问
-
但规范明确指出必须验证 id_token:(openid.net/specs/openid-connect-implicit-1_0.html#ImplicitFlow) 2.1。隐式流
** 6 Client validates the tokens and retrieves the End-User's Subject Identifier.** -
简而言之:签名令牌的验证如何在前端发生?
标签: oauth-2.0 access-token openid-connect