我已经实现passportGitHub-Strategy. 这是格利斯它运行得非常好,我从 GitHub 收到了重定向的用户配置文件。

现在,我只是想了解这实际上是如何在“幕后”工作的。我在 stackoverflow 上没有找到任何类似的问题,在Passport上也没有。

因此,如果我在 Auth-Flow 期间打开 Chrome 开发人员工具,当我单击“使用 GitHub 登录”时,似乎会发生以下情况:

  1. 节点路由/auth/github称为
  2. 节点重定向到https://github.com/login/oauth/authorize?response_type=code&redirect_uri=https%3A%2F%2Frightful-exclusive-carriage.glitch.me%2Fauth%2Fgithub%2Fcallback&client_id=ccfcc73fac8223317176
  3. 用户会看到 GitHub-Login-Page
  4. 用户输入 GitHub 凭证并单击“登录”
  5. GitHub 检查凭据
  6. 如果提供了有效的凭据,用户将通过身份验证,并且 GitHub 会重定向到注册的回调端点,在我的例子中是这样的:https://rightful-exclusive-carriage.glitch.me/auth/github/callback
  7. 回调 url 有一个 url 参数,例如?code=02337a951c242b9202fd有趣的是,它是一个 GET 方法,没有提供其他任何内容。
  8. 在服务器上,该passport.authenticate('github', ...)方法在路由内部调用/auth/github/callback
  9. 当 GithubStrategy 实例化时,会传递带有签名的回调函数function(accessToken, refreshToken, profile, cb)神奇的是,accessTokenprofile在这里完全可用。我不明白这是怎么发生的。

护照如何接收个人资料?正在node.js对 GitHub 进行服务器端调用吗?也许与?code=<id>


是的,这正是 NodeJS 正在做的事情。这与 Passport.JS 或 Node.JS 没有任何关系。这是授权如何工作的 OAuth 机制。

每当像 twitter/facebook 这样的身份提供商/callback使用?code=查询参数调用您时,它就会点击另一个 url 并获取 AccessToken、RefreshToken 和 Idtoken(这基本上是用户配置文件)。

您也可以查看源代码:

在护照oauth策略的strategy.js#L157strategy.js#L173中:

if (req.query && req.query.code) {
    ....
    self._oauth2.getOAuthAccessToken(code, params,
        function(err, accessToken, refreshToken, params) {
    ....
    }
    ....
}

并且包中的oauth2.js#L177oauth2.js#L190node-oauth可以看到:

exports.OAuth2.prototype.getOAuthAccessToken= function(code, params, callback) {
  ...
  this._request("POST", this._getAccessTokenUrl(), post_headers, post_data, null, function(error, data, response) {
    ....
  })
}

基本上,POST 请求被发送到 accessTokenUrl。


需要澄清的一点是,引用 GitHub 的 OAuth-API-Docu:developer.github.com/apps/building-oauth-apps/… 在 '2. 用户被 GitHub 重定向回您的网站”,它说“如果用户接受您的请求,GitHub 将使用代码参数中的临时代码重定向回您的网站”和“将此代码交换为访问令牌:POST github.com ” /login/oauth/access_token ',这是 accessTokenUrl。'响应采用以下形式:access_token=e72e16c7e42f292c6912e7710c838347ae178b4a...'