所以现在我正在我的服务器中实现 oauth2,但我只想支持 client_credentials
授权。问题是,https://github.com/oauthjs/node-oauth2-server 说支持这种类型的授权,我几乎调试了整个库,有些东西对我来说没有意义.
据我了解, client_credentials
授权应该像这样工作:
- 应该发出一个内部请求来为客户端生成
client_id
和client_secret
,这是我们唯一一次获得client_secret
并且我们应该将它提供给我们的客户端 client_id
应该与任何额外的数据(如关联的帐户 ID 或类似的东西)和client_secret
的哈希一起存储在数据库中,以便我们稍后验证它- 客户端向服务器发送请求,包括
client_id
和client_secret
- 然后服务器应该生成一个访问令牌(在我的例子中,我将使用 JWT)并从请求中返回。我们还需要在数据库中 store 这个令牌,以便我们可以在需要时撤销权限
- 客户端必须在以后的请求中使用此访问令牌从服务器访问资源,如果令牌有效(未过期,未丢失权限等),服务器将验证每个请求
我可能对此有误,但这正是我所需要的,而这正是 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_id
和 client_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 调用。