我有一个iOS,它使用OAuth和OAuth2提供商(Facebook,谷歌,推特等)来验证用户并提供访问令牌。除了名称和电子邮件地址等最小数据外,应用程序不会将这些服务用于除身份验证之外的任何其他内容。
然后,应用程序将访问令牌发送到服务器,以指示用户已通过身份验证。
服务器是用Node.js编写的,在做任何事情之前,它需要根据正确的OAuth *服务验证提供的访问令牌。
我一直在环顾四周,但到目前为止,我发现的所有node.js身份验证模块似乎都是用于登录并通过服务器提供的网页进行身份验证。
有没有人知道任何可以对提供的访问令牌进行简单验证的node.js模块?
答案 0 :(得分:58)
据我所知(并且从我阅读规范可以看出)OAuth和OAuth 2规范没有为访问令牌验证指定单个端点。这意味着您将需要每个提供程序的自定义代码才能验证访问令牌。
我查找了您为指定的端点做些什么:
似乎others已使用图API的'me' endpoint进行Facebook检查令牌是否有效。基本上,请求:
https://graph.facebook.com/me?access_token={accessToken}
Google也有dedicated endpoint获取访问令牌信息,nice documentation也是如此。基本上,请求:
https://www.googleapis.com/oauth2/v1/tokeninfo?access_token={accessToken}
Twitter似乎没有一个非常明显的方法来做到这一点。我怀疑是因为account settings data非常静态,这可能是最好的验证方式(获取推文可能会有更高的延迟?),所以你可以请求(使用适当的OAuth签名等):< / p>
https://api.twitter.com/1.1/account/settings.json
请注意,此API的速率限制为每个窗口15次。
总而言之,这似乎比首次出现时更棘手。在服务器上实现某种会话/身份验证支持可能是个更好的主意。基本上,您可以验证一次获得的外部OAuth令牌,然后为用户分配一些您自己的会话令牌,您可以使用自己服务器上的用户ID(电子邮件,FB ID等)进行身份验证,而不是继续向OAuth提供商请求您自己获得的每个请求。
希望有所帮助!
答案 1 :(得分:0)
在Google生产中,您可以使用:
https://www.npmjs.com/package/google-auth-library
const ticket = client.verifyIdToken({
idToken: ctx.request.body.idToken,
audience: process.env.GOOGLE_CLIENTID
})
答案 2 :(得分:0)
对于生产中的 google,安装 google-auth-library (npm install google-auth-library --save
) 并使用以下内容:
const { OAuth2Client } = require('google-auth-library');
const client = new OAuth2Client(GOOGLE_CLIENT_ID); // Replace by your client ID
async function verifyGoogleToken(token) {
const ticket = await client.verifyIdToken({
idToken: token,
audience: GOOGLE_CLIENT_ID // Replace by your client ID
});
const payload = ticket.getPayload();
return payload;
}
router.post("/auth/google", (req, res, next) => {
verifyGoogleToken(req.body.idToken).then(user => {
console.log(user); // Token is valid, do whatever you want with the user
})
.catch(console.error); // Token invalid
});
有关 Authenticate google token with a backend server 的更多信息,可以找到 node.js、java、python 和 php 的示例。
对于 Facebook,执行 https 请求,例如:
const https = require('https');
router.post("/auth/facebook", (req, res, next) => {
const options = {
hostname: 'graph.facebook.com',
port: 443,
path: '/me?access_token=' + req.body.authToken,
method: 'GET'
}
const request = https.get(options, response => {
response.on('data', function (user) {
user = JSON.parse(user.toString());
console.log(user);
});
})
request.on('error', (message) => {
console.error(message);
});
request.end();
})
答案 3 :(得分:-1)
要获取有关Google使用的令牌的信息,请小心vith版本api
https://www.googleapis.com/oauth2/v3/tokeninfo?access_token={accessToken}