我正在使用ember-simple-auth
和torii
在我正在构建的Ember应用中处理针对Facebook和Google的客户端OAuth2身份验证。我收到了该流程的授权码。
我想将该代码从客户端发送到我的REST API并交换它们以访问令牌以获取其用户ID,以便我可以找出他们应该访问哪些信息。
然后,我想将用户ID放入一个JSON Web令牌中,客户端可以在BE应用程序的后续数据请求中发送给我。
我的问题:我发现使用Passport进行OAuth2身份验证的所有示例都依赖于重定向服务器端的用户并使用回调而不仅仅是交换已经提供的授权代码。
我错过了什么?这似乎是许多应用程序需要做的事情。
答案 0 :(得分:0)
假设符合OAuth 2.0标准,则通过对令牌端点URL执行POST
请求并使用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和我认为Google相同也允许您以JSON编码的身体传递参数,而不仅仅是application/x-www-form-urlencoded
格式。
<强>更新强>:
特定的身份验证提供程序可以实现其他库,以简化开发人员与它们集成的过程。例如,Auth0为您提供了passport-auth0,它提取并简化了将Auth0身份验证集成到应用程序中的方式。