总结一下您的情况:您有自己的后端(某种类型的服务器,例如实现 REST API 的 Web 应用程序),用户应该能够在其中使用用户名和密码登录以获得访问令牌,以便他们访问他们在服务器上拥有自己的资源,并且他们应该能够通过您自己的前端(某种客户端,例如智能手机应用程序、桌面应用程序、单页应用程序等)来执行此操作。 Resource Owner Password Grant 完美地解决了您的问题,但现在它已被弃用:(
注意
它在 OAuth 2.0 规范中说OAuth 2.0 授权框架使第三方应用程序能够获得有限的访问权限[...]。在这种情况下,您的前端并不是真正的第三方应用程序,而是第一方应用程序,因此您不应该真正使用 OAuth 2.0,但最好使用有据可查的东西,而不是发明自己的解决方案来处理授权,所以和你一样,我仍然会使用 OAuth 2.0。
简单的解决方案(已弃用)
继续使用资源所有者密码授予。它完全符合您的要求,并且是为您的特定情况创建的(前端和后端来自同一个“公司”)。
现在他们似乎已经决定 OAuth 2.1 不应该支持这样的第一方应用程序,但我会说它仍然可以用于您的情况。如果 Google 或其他大型 OAuth 2.0 提供商支持这种授权类型,情况会更糟,因为开发人员可能会创建自己的前端应用程序,并让用户通过直接在前端应用程序中输入他们的 Google 用户名和密码来登录他们的前端应用程序,即向前端开发人员透露他们的 Google 凭据。我想他们弃用这种 Grant Type 的原因是为了避免这种情况。
更好的解决方案(已弃用)
使用隐式授权。在前端,当用户想登录时,将用户重定向到后端(即在后端打开一个网页,用户可以输入用户名和密码的登录表单),并且在用户成功登录后在后端,使用访问令牌将客户端重定向回前端。这样做的好处是用户只向后端应用程序透露她的密码,而不会向任何客户端应用程序透露她的密码。缺点是后端必须包含登录表单的网页,与纯 REST API 相比,实现起来有点复杂。如果你想正确地做到这一点,服务器应该有一个带有 id 和秘密的预注册客户端列表,但是如果你只有自己的前端,你需要支持我会说你可以跳过它或者简单地硬编码一个客户端 id在后端应用程序中。
不幸的是,这种授权类型也已被弃用...
适当的解决方案
使用授权代码授予(带有用于代码交换的证明密钥)。这种方式与上面描述的隐式授权非常相似,但不是使用访问令牌将用户重定向回前端,而是使用授权码将用户重定向回前端。然后前端可以将此授权码发送到后端并取回访问令牌。
上面描述的或多或少只是授权码授予。 “用于代码交换的证明密钥”几乎相同,但您还使用“密钥”来证明您是将该用户重定向到后端的同一个客户端,并将授权代码交易为访问令牌( “with Proof Key for Code Exchange”部分基本上使它更安全)。
这里我当然只描述了总体思路,您需要查看规范以了解有关您应该发送的请求和响应的详细信息(请求的正文应该是什么,使用什么状态码等)。