经过大量研究,我发现client_credentials 授权类型适用于这种情况。将这个术语输入 google 后,您会发现大量非常有用的资源。
这是 3-legged OAuth 2.0 的正常流程(我们希望用户登录):
假设我们的应用中有以下端点用于身份验证:
/oauth/auth
/oauth/token
通常(对于授权码授予),我们将用户定向到/oauth/auth?state=blah&client_id=myid&redirecturl=mysite.com/blah
然后在认证后,用户被重定向到mysite.com/blah?code=somecode
然后我们得到somecode 并使用/oauth/token?code=somecode&client_id=myid&client_secret=mysecret 将其交换为令牌
然后我们可以使用令牌进行调用。
这是client_credentials 实现 2-legged OAuth 2.0 的应用流程,明显更简单:
请注意,范围是可选的。然后端点直接返回一个访问令牌供我们使用(不提供刷新令牌)。由于没有提供刷新令牌,因此当令牌过期时,您需要重新进行身份验证并请求新的。
这导致以下警告:
- 仅将其用于(非常)受信任的应用程序,例如内部应用程序。
- 您需要设计自己的身份验证方式。例如,RFC's example 使用基本身份验证。
另一种解决方案是使用 JWT(JSON Web 令牌),例如 google OAuth API。这是一个非常复杂的过程,但是存在许多用于生成 JWT 的库。然后发布以下表单数据(当然是 url 编码):
grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&assertion=generated_jwt
这已发布到/oauth/token 以获取您的令牌。
关于是否可以创建支持2-legged和3-legged OAuth 2.0的API的问题,可以。
那么/auth 端点仅在用户需要对服务进行身份验证时使用。
在/token 端点中,只需检查urn:ietf:params:oauth:grant-type:jwt-bearer 的GET 参数中grant_type 的值(如果使用JWT 或client_credentials 用于client_credentials)。
请注意,在生成要提供给用户的 client_id 和 client_secret 时,如果您支持多个 grant_types,请确保您有一个数据库列来存储为什么类型的授权类型生成 id 和 secret。如果需要为每个用户提供多种授权类型,请为每种授权类型生成一组不同的凭据。