假设一个兼容的 OAuth 2.0 实现,通过执行POST
对令牌端点 URL 的请求并使用以下格式提供以下参数来完成为访问令牌交换授权代码application/x-www-form-urlencoded
:
grant_type
- 必须设置为authorization_code
。
code
- 将包含您拥有的代码的值。
redirect_uri
- 必须包含且值匹配,如果它也包含在获取授权码的请求中。
此外,根据客户端,client_id
如果客户端未颁发凭据,或者客户端具有需要执行客户端身份验证的凭据,则必须提供参数,这可以通过传递包含标识符的 HTTP Basic 身份验证标头来完成,并且秘密。
一个使用 的示例,unirest
但很容易适应其他 HTTP 客户端:
unirest.post(tokenEndpointUrl)
.headers({
'Accept': 'application/json',
'Content-type': 'application/x-www-form-urlencoded'
})
.auth({
user: clientId,
pass: clientSecret
})
.send(`redirect_uri=${redirectUrl}`)
.send(`code=${code}`)
.send('grant_type=authorization_code')
.end(function (response) {
// Handle response
});
尽管基本原理可能不会改变,但请检查每个提供程序的文档,因为它们可能有扩展,或者在如何提供信息方面更灵活。例如 Auth0 和我认为谷歌是一样的也将允许您以 JSON 编码的正文而不是application/x-www-form-urlencoded
格式传递参数。
更新:
特定的身份验证提供程序可能会实现其他库,以简化与它们集成的开发人员的工作。例如,Auth0为您提供了passport-auth0,它抽象并简化了您可以将 Auth0 身份验证集成到应用程序中的方式。