我正在使用express在NodeJS中构建一个API,并使用React构建一个SPA前端。我想保持域的独特性,即。* api.domain.com * 和 * ui.app.com *。
在API端应该如何进行身份验证?到目前为止,我在客户端使用PKCE实现了代码流,因此我得到了一个有效的访问令牌,沿着一个JWT id_token。我正在使用的库也能够刷新令牌。
当将JWT id_token 传递给API(通过头)时,我还可以使用众所周知的公钥证书来验证和验证JWT令牌,因此可以确定请求来自登录的用户,并授予访问权限。
这是保护API的正确方法吗?
如果我需要进行适当的授权(使用RBAC或gRPC),JWT id_token是否足够,或者我应该传递访问令牌(不是JWT)并使用该令牌来请求身份数据和角色/权限?
1条答案
按热度按时间icnyk63a1#
您所描述的内容似乎适合Web应用程序客户端类型:
Web应用程序
Web应用程序是在Web服务器上运行的机密客户端。资源所有者通过在资源所有者使用的设备上的用户代理中呈现的HTML用户界面访问客户端。客户端凭证以及颁发给客户端的任何访问令牌存储在Web服务器上,并且不向资源所有者公开或可由资源所有者访问。
RFC 6749-第2.1节
这将有助于缓解你目前的一些问题。
您的后端/API将服务于OAuth 2.0框架所描述的“客户端”角色(与我们所说的“客户端”相反,即在浏览器中运行的前端)。
因此,您可以执行授权代码流(PKCE不是必需的,但它只对有帮助)。然后,您的后端将从授权服务器接收令牌。
你的最后一段有点混乱。你确定访问令牌是 * 不是 * 一个JWT?虽然它们不一定必须如此,但OAuth 2.0几乎无处不在地采用了它。如果使用web应用程序设置,则后端将直接返回id令牌,它可以使用它来做出其他决策或使用userinfo端点。id令牌用于OAuth 2.0客户端或OIDC所称的依赖方。
OpenID Connect 1.0是OAuth 2.0 [RFC 6749](Hardt,D.,“The OAuth 2.0 an Authorization Framework,”October 2012.)协议之上的简单身份层。它使客户端能够基于授权服务器执行的身份验证来验证最终用户的身份,以及以可互操作和类似REST的方式获得关于最终用户的基本简档信息。
OIDC-Sec1.0
使用Web应用程序类型进行设置还有助于保护令牌免受被盗或滥用,因为它们直接返回到后端,而不是更容易访问的前端。