0

我正在使用ember-simple-authtorii在我正在构建的 Ember 应用程序中处理针对 Facebook 和 Google 的客户端 OAuth2 身份验证。我从该过程中收到一个授权码。

我想将该代码从客户端发送到我的 REST API 并将它们交换为访问令牌以获取他们的用户 ID,以便我可以弄清楚他们应该有权访问哪些信息。

然后,我想将用户 ID 放入 JSON Web 令牌中,客户端可以在后续请求来自 BE 应用程序的数据时向我发送该令牌。

我的问题:我发现的所有使用 Passport 进行 OAuth2 身份验证的示例都依赖于在服务器端重定向用户并使用回调,而不是仅仅交换已经提供的授权代码。

我错过了什么?这似乎是许多应用程序需要做的事情。

4

1 回答 1

0

假设一个兼容的 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 身份验证集成到应用程序中的方式。

于 2016-10-14T08:09:13.897 回答