node.js - OAuth2 客户端凭据

所以现在我正在我的服务器中实现 oauth2,但我只想支持 client_credentials 授权。问题是,https://github.com/oauthjs/node-oauth2-server 说支持这种类型的授权,我几乎调试了整个库,有些东西对我来说没有意义.

据我了解, client_credentials 授权应该像这样工作:

  1. 应该发出一个内部请求来为客户端生成 client_idclient_secret,这是我们唯一一次获得 client_secret 并且我们应该将它提供给我们的客户端
  2. client_id 应该与任何额外的数据(如关联的帐户 ID 或类似的东西)和 client_secret 的哈希一起存储在数据库中,以便我们稍后验证它
  3. 客户端向服务器发送请求,包括 client_idclient_secret
  4. 然后服务器应该生成一个访问令牌(在我的例子中,我将使用 JWT)并从请求中返回。我们还需要在数据库中 store 这个令牌,以便我们可以在需要时撤销权限
  5. 客户端必须在以后的请求中使用此访问令牌从服务器访问资源,如果令牌有效(未过期,未丢失权限等),服务器将验证每个请求

我可能对此有误,但这正是我所需要的,而这正是 https://docs.identityserver.io/en/latest/quickstarts/1_client_credentials.html 所做的,https://www.oauth.com/oauth2-servers/access-tokens/client-credentials/ 对此进行了解释。

就我而言,我正在使用 nodejs。实际上是一个 NestJS 项目,所以我尝试使用 https://www.npmjs.com/package/@boyuai/nestjs-oauth2-server,它基本上是 node-oauth2-server 的包装器,如果你看一下 node-oauth2-server 内部,看起来它们只支持授权码,这是因为 AuthorizeHandler.handle() 总是返回一个授权码,而 AuthenticateHandler.handle() 总是需要授权码并返回访问令牌。基本上我需要调用 AuthenticateHandler.handle() 但不是检查授权码,我必须通过并检查 client_idclient_secret

这是最近的一个问题,与我的问题完全相同:https://github.com/oauthjs/node-oauth2-server/issues/552

所以,首先,我想确认我是对的,并且这个库的实现方式很糟糕,其次,是否还有其他内置 client_credentials 的 nodejs 库?

回答1

正如您提到的,它目前不支持 client_credentials 授权,您仍然可以在内部使用授权代码流授权类型来获取访问令牌。

  • 准备 client_credentials 授权类型请求并提交给服务器。
  • 将此请求映射到具有 authorization code 流所需的附加属性的授权代码流。
  • 向授权服务器提交请求。
  • 从响应中获取代码。
  • 使用 oauth code 准备令牌交换调用。
  • 获取 access_token
  • 返回令牌以响应 client_credentials 调用。

相似文章