我正在使用后端实现OAuth Google登录(使用heroku编写的node.js,express框架)。前端是Android,它将令牌ID发送到服务器就好了。服务器正确接收令牌ID。
以下是代码(直接从Google文档中删除)
var auth = new GoogleAuth;
var client = new auth.OAuth2(CLIENT_ID, '', '');
client.verifyIdToken(
token,
CLIENT_ID,
// Or, if multiple clients access the backend:
//[CLIENT_ID_1, CLIENT_ID_2, CLIENT_ID_3],
function(e, login) {
var payload = login.getPayload();
var userid = payload['sub'];
// If request specified a G Suite domain:
//var domain = payload['hd'];
});
但有时登录未定义。它很奇怪,这个问题发生在1/10而不是每次尝试,所以我无法追踪问题的根源。对于其他每一个9/10,它的工作正常。
有关如何解决此问题的任何建议?
答案 0 :(得分:2)
您的代码中的问题是您没有检查您的回调是否有任何错误。
node.js中使用回调函数的标准方法是使用两个参数 - 错误是第一个,实际(成功)返回的数据是第二个,并且约定是如果存在错误 - 你应该解决它,并且您没有获得数据的保证,如果一切顺利,错误将为空,您将获得数据。
因此,在您的代码中,您没有检查是否存在错误(就像您说的那样,并非总是存在错误。)
应该是这样的:
function(e, login) {
if (e) {
// handle error here
return; // don't continue, you don't have login
}
// if we got here, login is defined
var payload = login.getPayload();
var userid = payload['sub'];
// If request specified a G Suite domain:
//var domain = payload['hd'];
});
答案 1 :(得分:1)
回调函数的第一个参数是需要处理的错误。
function(error, login) {
if (error) return console.error(error)
var payload = login.getPayload();
var userid = payload['sub'];
// If request specified a G Suite domain:
//var domain = payload['hd'];
});