我有一个带有JWT身份验证的Django Rest API,它是Angular前端的后端。有许多客户在我们的前端使用该服务。现在,一些企业客户希望从系统的后端集成API。我不想从当前的API中删除JWT。我计划在同一个后端使用OAuth令牌为这些用户创建新的API。
我想知道在这种情况下实施OAuth的最佳方法是什么。
我认为Client Credentials授权类型是最好的方法。
问题1:我认为客户凭证是正确的方法吗?
对于那些企业用户来说,通过UI界面获取访问令牌就足够了,这样他们就可以访问我们所有的API。但这里的问题是首先获取客户端ID和客户端密钥并使用它来获取访问令牌的另一个步骤。
问题2:客户端ID和客户端密钥的用途是什么?
问题3:我的后端是否应该隐藏生成客户端ID和客户端密钥的过程,只是给予Access令牌(或)给他们客户端ID和客户端机密,然后要求生成访问令牌?
问题4:如果我给他们没有客户端ID和秘密的访问令牌,那么有无限的到期时间是没关系的吗?和
TLDR;当资源服务器和auth服务器相同时,如何实现OAuth?
问题1:我认为客户凭证是正确的方法吗?
是。不需要在最终用户的上下文中调用提供新API。
问题2:客户端ID和客户端密钥的用途是什么?
在这种情况下,它实际上是用户名和密码。
问题3:我的后端是否应该隐藏生成客户端ID和客户端密钥的过程,只是给予Access令牌(或)给他们客户端ID和客户端机密,然后要求生成访问令牌?
您的Auth服务器应该向应用程序发出一次客户端凭据,应用程序应在每次希望通过客户端凭据授予类型获取令牌时提供这些凭据。
authorization code
grant或implicit
grant可能更适合这种情况。第一个允许您在将令牌返回给用户之前添加身份验证步骤(如果您希望将JWT身份验证也集成到此用户可能很有用),第二个主要用于单页应用程序,并且不包括中间身份验证步骤。如果您想提高效率,这将是有用的。client_id
和client_secret
。此客户端应用程序不是指属于您的客户端的应用程序或API,而是您计划合并OAuth(和OIDC)的应用程序。在发出授权请求以获取令牌时,这两个参数非常有用。服务器使用这些值来确定请求是否由有效的应用程序发出。只有您可以访问这些值,因为您将是向服务器注册应用程序的人。我认为如果你在做任何实施之前通过this会更好。它提供了在实施OAuth系统之前应具备的大部分基本知识。我希望这个答案对你有用。
oAuth2中有4种授权类型,适用于不同的场景。
客户端凭证:消费者(app)使用使用apikey(或clientId)创建的承载令牌进行后端调用,仅限秘密。主要用于检索通用信息的匿名调用。
资源所有者密码凭证(ROPC):消费者(app)使用使用apikey,密码,用户名和密码创建的承载令牌进行呼叫。当您(您的授权服务器)已经知道用户(用户数据库在您自己的系统中处理)时,通常使用。
授权代码:消费者(app)使用授权代码创建的承载令牌进行调用。授权代码由第三方(实际拥有/管理登录的用户数据)和创建的授权代码提供,该授权代码链接到登录用户。 Google和Facebook登录各种网站就是一个典型的例子。 Facebook / Google为这些网站提供授权代码,并为代码交换该代码。
隐式授权:密码凭证和授权代码的混合。您可以从第三方授权服务器获取承载令牌,而不是授权码。
问题1:我认为客户凭证是正确的方法吗?我认为如果你的后端没有用户级别的逻辑,你可以使用CC。如果涉及userlevel,可能是ROPC是更好的选择
问题2:客户端ID和客户端密钥的用途是什么?客户端ID和客户端密钥与应用程序级别的用户名和密码非常相似,用于获取承载令牌。
问题3:我的后端是否应该隐藏生成客户端ID和客户端密钥的过程,只是给予Access令牌(或)给他们客户端ID和客户端机密,然后要求生成访问令牌?如果要实现oAuth2,则您的使用者应该创建访问令牌。但是看看你的用例,甚至可能是userId + timestamp的简单哈希就足够了。 ;)