资源和授权服务器相同时如何实现OAuth

How to implement OAuth when the resource and auth servers are same

我有一个带有 JWT 身份验证的 Django Rest API,它是 Angular 前端的后端。有许多客户使用我们的前端服务。现在一些企业客户希望从他们的系统后端集成 APIs。我不想从当前 API 中删除 JWT。我计划在 相同的后端 中为这些用户使用 OAuth 令牌创建新的 API。

我想知道在这种情况下实现 OAuth 的最佳方式是什么。

我认为客户端凭据授予类型是最好的方法。

问题 1:我认为客户端凭据是正确的方法对吗?

对于那些企业用户,他们只需通过 UI 接口获得访问令牌就足够了,这样他们就可以访问我们所有的 API。 但这里的问题是首先获取客户端 ID 和客户端密码并使用它来获取访问令牌的额外步骤。

问题2:client ID和client secret有什么用?

问题 3:我的后端是否应该隐藏生成 Client ID 和 Client secret 的过程并只提供访问令牌(或)给他们 Client ID 和 Client Secret 然后要求生成访问令牌?

问题 4:如果我给他们没有客户端 ID 和密码的访问令牌,可以无限期到期吗?和

TLDR; 资源服务器和auth服务器相同时如何实现OAuth?

  1. authorization code grant 或 implicit grant 可能更适合这种情况。第一个允许您在将令牌返回给用户之前添加身份验证步骤(如果您也想将 JWT 身份验证集成到此可能很有用),第二个主要用于单页应用程序,并且确实不包括中间身份验证步骤。如果你想提高效率,这个会很有用。
  2. client_idclient_secret 是在您在身份提供者(授权服务器)中注册客户端应用程序时提供给您的。此客户端应用程序并不意味着属于您的客户的应用程序或 API,而是您计划将 OAuth(和 OIDC)合并到其中的您自己的应用程序。这两个参数在发出授权请求以获取令牌时很有用。服务器使用这些值来确定请求是否由有效的应用程序发出。只有您有权访问这些值,因为您将是向服务器注册应用程序的人。
  3. 我认为这个问题在上一节中得到了回答。

我认为如果您在执行任何实施之前通过 this 会更好。它提供了您在实施 OAuth 系统之前应该具备的大部分基础知识。希望这个回答对你有用。

Question1: Am I right that client credentials is the right approach ?

是的。提供新的 APIs 不需要在最终用户的上下文中调用。

Question 2: What is the use of client ID and client secret ?

  • 客户端ID允许授权服务器识别应用程序 请求令牌(它通常传递给访问令牌 也允许 API 识别调用应用程序)。
  • 客户端Secret表示授权服务器可以信任客户端 真正的他说他是谁因为只有他应该有私人客户 他的 public 客户端 ID 的秘密。

在这种情况下,它实际上是一个用户名和密码。

Question3: Should my backend hide the process of generating Client ID and Client secret and just give Access token (or) give them Client ID and Client Secret and ask then to generate access token ?

您的 Auth 服务器应向应用程序颁发一次客户端凭据,并且应用程序应在每次希望通过客户端凭据授权类型获取令牌时提供这些凭据。

oAuth2 中有 4 种授权类型,适用于不同的场景。

客户端凭据:消费者(应用程序)使用使用 apikey(或 clientId)创建的不记名令牌调用后端,并且仅使用秘密。主要用于检索一般信息的匿名调用。

资源所有者密码凭证 (ROPC):消费者(应用程序)使用使用 apikey、秘密、用户名和密码创建的不记名令牌进行调用。主要用于您(您的授权服务器)已经知道用户(用户数据库在您自己的系统中处理)的情况。

授权码:消费者(应用程序)使用使用授权码创建的不记名令牌进行调用。授权码由第三方(实际上 has/manages 登录用户数据)提供,创建的授权码链接到登录用户。 Google 和Facebook登录各种网站就是一个典型的例子。 Facebook/Google 为这些网站提供授权代码,他们用该代码交换令牌。

隐式授权:密码凭据和授权码的混合。您从第 3 方授权服务器获取不记名令牌,而不是授权代码。

问题 1:我认为客户端凭据是正确的方法对吗? 如果您的后端没有用户级逻辑,我认为您可以使用 CC。如果涉及用户级别,可能 ROPC 是更好的选择

问题2:client ID和client secret有什么用? Client ID 和 Client Secret 与应用层的 username 和 password 非常相似,用于获取 bearer token。

问题 3:我的后端是否应该隐藏生成 Client ID 和 Client secret 的过程并只提供访问令牌(或者)给他们 Client ID 和 Client Secret 然后要求生成访问令牌? 如果您正在实施 oAuth2,您的消费者应该创建访问令牌。但是看看你的用例,甚至可能是 userId+timestamp 的简单散列就足够了。 ;)