我正在尝试在Node中获取用户个人资料详细信息。
流量是这样的,我有一个移动应用程序为我生成令牌(通过谷歌和原生SDK进行身份验证),然后我将令牌发送到我的节点服务器,我想从谷歌获取有关用户的详细信息。我尝试了以下(假设我有来自客户端的access_token
):
var request = require('request');
request('https://www.googleapis.com/oauth2/v2/userinfo?access_token=' + access_token, function(err, res, body) {
if (err) return callback(err);
if (res.statusCode != 200) {
return callback(new Error('Invalid access token: ' + body));
}
else {
var me;
try { me = JSON.parse(body);}
catch (e) {
return callback(new Error('Unable to parse user data: ' + e.toString()));
}
console.log('user profile:', me);
}
});
这样可行,但有时我会得到错误的响应,例如null displayName
字段,null email
(即使我有范围)并且它总体上不可靠。
我尝试过使用Google API Node module,但是那里的流程假定我需要获取令牌并且不必要地复杂化。
除此之外,我不明白Google的API版本之间的差异,也不知道何时使用。
修改
似乎null displayName
字段的问题只发生在通过iOS SDK生成的令牌上。使用Android SDK生成的标记很好,并使用它们调用API在displayName
中解析。我尝试使用iOS令牌并调用以下API:
https://www.googleapis.com/plus/v1/people/me?access_token=...
我在结果中得到displayName
,但是在我的服务器发出几个电话之后我得到了
{
"error": {
"errors": [
{
"domain": "usageLimits",
"reason": "dailyLimitExceededUnreg",
"message": "Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup.",
"extendedHelp": "https://code.google.com/apis/console"
}
],
"code": 403,
"message": "Daily Limit for Unauthenticated Use Exceeded. Continued use requires signup."
}
}
答案 0 :(得分:4)
该问题与我的IOS用户生成的令牌隔离开来。
似乎我通过IOS SDK获取的令牌不适合使用我在我的问题(https://www.googleapis.com/oauth2/v2/userinfo
)中提到的API调用。 Android SDK生成的令牌可以正常使用上述调用。
因此,为了找到共同点,我必须从我的服务器使用以下API调用:
https://www.googleapis.com/plus/v1/people/me?access_token=...
你应该得到一个类似这样的对象(省略个人字段):
{
kind:"plus#person",
etag:"...",
gender:"male",
emails:[
{
value:"...",
type:"account"
}
],
urls:[
{
value:"...",
label:"Buzz"
}
],
objectType:"person",
id:"...",
displayName:"...",
name:{
familyName:"...",
givenName:"..."
},
url:"...",
image:{
url:"..."
},
isPlusUser:true,
language:"en",
ageRange:{
min:21
},
verified:false,
cover:{
layout:"banner",
coverPhoto:{
url:"...",
height:626,
width:940
},
coverInfo:{
topImageOffset:0,
leftImageOffset:0
}
}
}