是否应该在浏览器中验证 OpenID 连接 ID 令牌?
Posted
技术标签:
【中文标题】是否应该在浏览器中验证 OpenID 连接 ID 令牌?【英文标题】:Should OpenID connect ID tokens be validated in the browser? 【发布时间】:2018-09-29 07:07:47 【问题描述】:在撰写有关 OpenID connect with Angular 的博客系列时,我正在使用一个名为 angular-auth-oidc-client 的用于 OpenID connect 的 Angular 库。该库用于实现 OpenID 连接隐式流程,并对 ID 令牌和访问令牌进行客户端验证。
我的问题是:
由于 Angular 应用程序存在于浏览器中,其中包含可以被恶意用户篡改的 javascript 文件,例如。嗅探其他用户访问令牌,禁用ID令牌验证,在浏览器中进行ID令牌验证是不是毫无意义?我知道客户端使用 ID 令牌来验证身份验证,但是在浏览器中完成此操作时它是否提供任何安全性?
-
在请求资源 API 之前,在浏览器中不验证 ID 令牌,而是使用前端服务器验证 ID 令牌会更好吗?
我的问题不是关于 OpenID 连接的规范,而是关于使用浏览器进行 id 令牌验证。我创建了一篇博文here,我在其中从实践层面解释了 OpenID 连接。
谢谢。
【问题讨论】:
【参考方案1】:您的 API(API 后端)应为每个请求验证令牌。前端只是生成令牌并将其添加到每个 API 请求中(请参阅 HTTP 拦截器)。
【讨论】:
请阅读我的问题。我知道资源 api 应该验证访问令牌,这不是我的问题。前端不生成令牌,授权服务器生成,但是是的,它将它作为不记名令牌发送到资源 api :) 但我的问题是 id 令牌的浏览器验证是否提供任何安全性,因为用户可以使用 js 在浏览器。 我同意@lyzz,它是关于浏览器中的 ID 令牌验证,而不是后端。对于后端,令牌应该是 access_token。【参考方案2】:ID 令牌是一种安全令牌。 您的客户端(Angular 应用程序)应验证 OIDC 提供者发送的任何 ID 令牌以验证用户身份。 如果未完成此验证,您将通过验证恶意用户将您的 API 暴露于安全问题。 有关 ID Token 的详细信息,请参阅this specification。
访问令牌也是安全令牌,但您的客户端不应执行任何验证并“按原样”使用它。 字符串通常对客户端是不透明的。 访问令牌的验证由资源服务器执行(例如,使用Introspection Endpoint 或检查自包含访问令牌)。 有关访问令牌的详细信息,请参阅this specification。
【讨论】:
感谢您的回答,但请阅读我的问题。我知道客户端使用 id 令牌来验证 requestions 用户的身份验证。 我的问题是它是否提供了在浏览器中进行 id 令牌验证的任何安全性,其中执行验证的 js 可以由用户更改。我在这里有一篇关于 OpenID connect here 工作的博客文章,它更深入地解释了 OpenID 连接规范。 嗯...我的答案很明确:您必须验证 ID 令牌。无论哪一方会使用它(原生应用程序、JS 脚本、前端服务器......)。你写了validating ID token before requesting a resource API
。您可以先检查 ID 令牌,然后向资源服务器发送请求(带有访问令牌)。这里有优先顺序。我阅读了你的博客文章,我可以看到需要做一些小的改进。访问令牌令牌不一定是 JWT(例如,它可以是完整的随机字节字符串)。 JWT 可以加密(参见 RFC7516)。还是不错的博文。【参考方案3】:
单页应用程序,SPA,sole 的目的是为人类提供一种 UX 体验,以替代手动执行大量 curl 命令来后端微服务。如果令牌验证失败,SPA 应该向人类提供有意义的 UX 交互。
SPA 正在参与身份验证交换。不负责验证令牌是没有意义的。试图将该责任委托给其他地方是一种脆弱的做法,它会不必要地扩大身份验证交换中的参与者范围。在任何分布式协作中,参与者越少越好。
【讨论】:
【参考方案4】:angular-auth-oidc-client 中提到了隐式流现在不是推荐的选项,因为其他更安全的选项(如 PKCE)可用。
关于浏览器中 ID 令牌验证的问题,考虑到嗅探另一个用户的访问令牌不属于前端安全范围,因为这更多是关于在身份验证机制中引入传输层安全性。请参阅此link 了解可以实施的 PKI 最佳实践。一旦我们完成了令牌嗅探,恶意用户就可以去任何扩展并冒充原始令牌持有者,即使如您所说的那样在前端服务器中进行令牌验证,我们也无法使恶意用户无效。
【讨论】:
以上是关于是否应该在浏览器中验证 OpenID 连接 ID 令牌?的主要内容,如果未能解决你的问题,请参考以下文章
解释 Open ID 连接中的离线令牌验证与在线令牌验证?优势、局限和权衡
Google OpenID Connect:如何验证 id_token?
OpenID Connect id_token 和 access_token 如果是web server获取的,需要验证吗?