【发布时间】:2018-01-15 19:47:23
【问题描述】:
在我工作的一个应用程序中,我们正在考虑仅将 id_token 用于所有用例,包括身份验证和授权。该解决方案目前正在从头开始开发。目前没有任何资源的消费者,我们可以修改资源以使用 id_token。我对 openid_connect 和 oauth 2.0 的概念有点陌生。仅使用具有所有访问详细信息的 id_token 会有任何问题吗?
【问题讨论】:
在我工作的一个应用程序中,我们正在考虑仅将 id_token 用于所有用例,包括身份验证和授权。该解决方案目前正在从头开始开发。目前没有任何资源的消费者,我们可以修改资源以使用 id_token。我对 openid_connect 和 oauth 2.0 的概念有点陌生。仅使用具有所有访问详细信息的 id_token 会有任何问题吗?
【问题讨论】:
如果您的应用程序只需要对用户进行身份验证,然后让他们使用他们可能访问的所有功能访问其后端,那么仅使用 ID 令牌并根据用户名或角色检查访问权限会更容易。仅使用 ID 令牌时,您还可以接受来自不同 OAuth2 提供者的 ID 令牌。
访问令牌对于部分访问委派很有用 - 当用户将他们的一些权限委派给另一个应用程序时。例如,如果我创建了一个应用程序,要求其用户对其 GMail 进行只读访问,则该应用程序可以获得访问权限,而无需访问用户的任何其他 Google 资源。
如果您想为一个简单的客户端应用程序及其后端使用访问令牌,您的客户端应用程序会询问它可能使用的所有 OAuth2 范围,然后查看从 OAuth2 获取的访问令牌中返回的范围服务器。
因此,如果您只想为其前端创建后端 API,并且不打算为其他应用程序打开它,那么仅使用 ID 令牌会更容易。如果您发现需要访问令牌,您可以稍后开始使用它们。
您还可以考虑根据提供的 ID 令牌发布您自己的令牌 (JWT),其中包含您需要的所有身份验证和授权信息,这样您的后端就不必在每次 API 访问时获取用户的安全数据。
【讨论】:
我建议按照设计的 OIDC 规范(即,使用 access_token 而不是 id_token 进行资源服务器授权)以防止自己面临安全漏洞。
这里有一个关于使用 id_token 作为 access_token 的很好的讨论:https://github.com/IdentityServer/IdentityServer3/issues/2015#issuecomment-147527823
该规范是为在客户端使用的 id 令牌和 要在 API 上使用的访问令牌。我相信你能想出 一些替代协议来重用 id 令牌,但 OAuth2 和 OIDC 只是没有那样发展。我确定它们是否都是从 从头开始,它们看起来会有所不同。
至于“将 id 令牌传递到后端是否安全”——不确定。一世 真的没有仔细研究针对它的攻击或它是如何发生的 被操纵或被愚弄。规范作者会做那种事情,并且 这就是为什么我们倾向于坚持他们的领先优势,因为他们已经花费了很多 比我有更多的时间。
问题,为什么要使用 id_token 而不是 access_token?获取真正的 access_token 很容易,为什么要违反规范?
更新:
如果您确实允许在资源服务器上使用 id_token(请注意),您需要将允许调用您的 API 的每个客户端“受众”列入白名单,除非您希望任何通过您的提供商身份验证的应用程序调用您的API!同样,我建议您遵循规范,否则您将在可靠指导的真空中制造安全漏洞。
【讨论】:
所有授权都是本地的。这意味着具有要共享资源的服务器需要具有信息来决定是否释放资源。所以问题是; id_token 是否有足够的信息以及所需的保证级别来进行授权。这是这里唯一真正的问题。
【讨论】: