护照如何接收个人资料?
How is passport receiving the profile?
我已经用 GitHub-Strategy
实现了 passport
。这是 Glith。
它工作得很好,我收到了来自 GitHub.
的重定向用户配置文件
现在,我只是想了解这实际上是如何工作的 'under the hood'。
我在 Whosebug 和 Passport.
上都没有发现任何类似的问题
因此,如果我在 Auth-Flow 期间打开 Chrome Developer Tools,当我点击 Login with GitHub:
时,似乎会发生以下情况
- 节点路由
/auth/github
被调用
- 节点重定向到
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
- 用户显示 GitHub-登录页面
- 用户输入 GitHub-凭据并点击 'Login'
- GitHub 检查凭据
- 如果提供了有效的凭据,用户将通过身份验证并且 GitHub 重定向到注册的回调端点,在我的例子中是这样的:
https://rightful-exclusive-carriage.glitch.me/auth/github/callback
- 回调-url 有一个url-参数,例如
?code=02337a951c242b9202fd
。有趣的是,它是一个 GET 方法,没有提供任何其他方法。
- 在服务器上,
passport.authenticate('github', ...)
方法在 /auth/github/callback
-路由内部被调用。
- 实例化 GithubStrategy 时,会传递一个带有签名
function(accessToken, refreshToken, profile, cb)
的回调函数。不知何故,accessToken
和 profile
在这里完全可用。我不明白这是怎么发生的。
护照如何接收个人资料?
node.js
是否在服务器端调用 GitHub?也许与 ?code=<id>
?
是的,这正是 NodeJS 正在做的事情。这与 Passport.JS 或 Node.JS 没有任何关系。它是授权工作方式的 OAuth 机制。
每当像 twitter/facebook 这样的身份提供者使用 ?code=
查询参数调用您的 /callback
时,它会命中另一个 url 并获取 AccessToken、RefreshToken 和 Idtoken(这基本上是用户配置文件)。
您也可以在源代码中查看:
在这个 strategy.js#L157 and strategy.js#L173 的 passports oauth 策略中:
if (req.query && req.query.code) {
....
self._oauth2.getOAuthAccessToken(code, params,
function(err, accessToken, refreshToken, params) {
....
}
....
}
而node-oauth
包的oauth2.js#L177 and oauth2.js#L190可以看到:
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-Strategy
实现了 passport
。这是 Glith。
它工作得很好,我收到了来自 GitHub.
现在,我只是想了解这实际上是如何工作的 'under the hood'。 我在 Whosebug 和 Passport.
上都没有发现任何类似的问题因此,如果我在 Auth-Flow 期间打开 Chrome Developer Tools,当我点击 Login with GitHub:
时,似乎会发生以下情况- 节点路由
/auth/github
被调用 - 节点重定向到
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
- 用户显示 GitHub-登录页面
- 用户输入 GitHub-凭据并点击 'Login'
- GitHub 检查凭据
- 如果提供了有效的凭据,用户将通过身份验证并且 GitHub 重定向到注册的回调端点,在我的例子中是这样的:
https://rightful-exclusive-carriage.glitch.me/auth/github/callback
- 回调-url 有一个url-参数,例如
?code=02337a951c242b9202fd
。有趣的是,它是一个 GET 方法,没有提供任何其他方法。 - 在服务器上,
passport.authenticate('github', ...)
方法在/auth/github/callback
-路由内部被调用。 - 实例化 GithubStrategy 时,会传递一个带有签名
function(accessToken, refreshToken, profile, cb)
的回调函数。不知何故,accessToken
和profile
在这里完全可用。我不明白这是怎么发生的。
护照如何接收个人资料?
node.js
是否在服务器端调用 GitHub?也许与 ?code=<id>
?
是的,这正是 NodeJS 正在做的事情。这与 Passport.JS 或 Node.JS 没有任何关系。它是授权工作方式的 OAuth 机制。
每当像 twitter/facebook 这样的身份提供者使用 ?code=
查询参数调用您的 /callback
时,它会命中另一个 url 并获取 AccessToken、RefreshToken 和 Idtoken(这基本上是用户配置文件)。
您也可以在源代码中查看:
在这个 strategy.js#L157 and strategy.js#L173 的 passports oauth 策略中:
if (req.query && req.query.code) {
....
self._oauth2.getOAuthAccessToken(code, params,
function(err, accessToken, refreshToken, params) {
....
}
....
}
而node-oauth
包的oauth2.js#L177 and oauth2.js#L190可以看到:
exports.OAuth2.prototype.getOAuthAccessToken= function(code, params, callback) {
...
this._request("POST", this._getAccessTokenUrl(), post_headers, post_data, null, function(error, data, response) {
....
})
}
基本上 POST 请求被发送到 accessTokenUrl。