仅使用访问令牌在节点中获取Google +用户个人资料

时间:2013-11-12 10:06:41

标签: javascript node.js oauth-2.0 google-plus google-api-nodejs-client

我正在尝试在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."
 }
}

1 个答案:

答案 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
    }
  }
}