0

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

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

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

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

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

问题2:客户端ID和客户端密码有什么用?

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

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

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

4

3 回答 3

1

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

客户端凭据:消费者(应用程序)使用使用 apikey(或 clientId)创建的不记名令牌和仅机密调用后端。主要用于检索通用信息的匿名呼叫。

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

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

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

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

问题2:客户端ID和客户端密码有什么用? Client ID 和 Client Secret 非常类似于应用程序级别的用户名和密码,用于获取承载令牌。

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

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

我认为如果您在执行任何实施之前先完成此操作会更好。它提供了您在实施 OAuth 系统之前应具备的大部分基本知识。我希望这个答案对你有用。

于 2019-03-20T12:57:03.277 回答
1

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

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

问题2:客户端ID和客户端密码有什么用?

  • 客户端 ID 允许身份验证服务器识别请求令牌的应用程序(它通常也传递到访问令牌,允许 API 识别调用应用程序)。
  • 客户端秘密意味着身份验证服务器可以相信客户端确实是他所说的那个人,因为只有他应该拥有他的公共客户端 ID 的私人客户端秘密。

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

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

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

于 2019-03-20T13:45:12.187 回答