1

我正在尝试在 Node.js 中获取用户配置文件详细信息。

流程是这样的,我有一个为我生成令牌的移动应用程序(通过通过 Google 和本机 SDK 进行身份验证),然后我将令牌发送到我的节点服务器,我想从 Google 获取有关用户的详细信息。我尝试了以下方法(假设我有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);
  }
});

这行得通,但有时我会得到不好的响应,比如 nulldisplayName字段、null email(即使我有范围),而且总体上不可靠。

我曾尝试使用Google API Node 模块,但那里的流程假设我需要获取令牌并且不必要地复杂。

除此之外,我不了解 Google 的 API 版本之间的区别,也不知道什么时候使用。

编辑

似乎空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."
 }
}
4

1 回答 1

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
    }
  }
}
于 2013-11-20T09:59:44.690 回答