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);
  }
});

displayNameこれは機能しますが、nullフィールド、null (スコープを持っていても) などの悪い応答が返されることがありemail、全体的に信頼性が低くなります。

Google API Node モジュールを使用してみましたが、そのフローはトークンを取得する必要があることを前提としており、不必要に複雑です。

それ以外は、Google の API のバージョンの違いがよくわからず、いつ何を使えばいいのかわからない。

編集

nulldisplayNameフィールドの問題は、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 を介して取得したトークンは、質問 ( ) で言及した API 呼び出しで使用するには不適切だったようhttps://www.googleapis.com/oauth2/v2/userinfoです。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 に答える