Google+ Api获取用户发送的电子邮件

时间:2017-05-31 11:04:36

标签: node.js google-api google-plus

我正在创建一个使用Google+ API注册。将数据插入“我的用户”表格时,我想收到用户的电子邮件。尝试这样做时出错。我的代码如下所示:

var API_KEY = 'A*****';         

plus.people.get({
    auth: API_KEY,
    userId: req.body.userID
}, function (err, user) {
    if( err ) { res.json( JSON.stringify( err ) );  return; }
    console.log(user.emails);

    User.find({ where:{ social_id:req.body.userID, type: 2 } }).then( existingUser =>{              
    if( existingUser ) throw new Error('social_user_existing');
    if(!existingUser){
    User.build({
        username: user.displayName,
        social_id : req.body.userID, 
        social_token :req.body.token, 
        type : 2
        }).save();                      
    }                          
    }).then(function( new_g_user ){                 
        return res.json( rs.success({ username: user.displayName, user_id: user.id, jwt: new_g_user.getJwt() }) );
    }).catch(function(err){
        res.json( rs.errorCode(err.message) );
    });   
});     

我尝试使用user.emails和user.emails [0] .value获取用户的电子邮件,以获取至少第一封电子邮件的值。每次,回复都是“未定义的”。我提到user.kind是'plus#person',而不是"plus#personOpenIdConnect"。这会导致我得到的反应吗?谢谢!

2 个答案:

答案 0 :(得分:2)

您正在使用API​​密钥进行身份验证,这意味着您只能访问公共数据。

请求

  

获取https://www.googleapis.com/plus/v1/people/+lindalawton

回复

{
 "kind": "plus#person",
 "etag": "\"Sh4n9u6EtD24TM0RmWv7jTXojqc/8CXX3KsOcUfAF5mmrG4vyB-YNig\"",
 "occupation": "Google Developer Expert, BIA Developer at Targit",
 "skills": "Experience primarily in regards Microsoft products, Visual Studio, Bids, C# and asp.net.  Past experience with PHP,JavaScript, MySQL and Linux.  In recent years I have begun focusing on Business Intelligence, Data Warehousing, SQL Server / Analysis Services / Integration Services.   Experience with OAuth2, Google Analytics API, Google Drive SDK.",
 "gender": "female",
 "urls": [
  {
   "value": "http://www.youtube.com/user/Atthena71",
   "type": "otherProfile",
   "label": "Linda Lawton"
  },
  {
   "value": "http://twitter.com/LindaLawtonDK",
   "type": "otherProfile",
   "label": "lindalawtondk"
  },
  {
   "value": "http://stackoverflow.com/users/1841839/daimto",
   "type": "otherProfile",
   "label": "Stackoverflow / StackExchange"
  },
  {
   "value": "http://www.linkedin.com/profile/edit?trk=nav_responsive_sub_nav_edit_profile",
   "type": "otherProfile",
   "label": "Linkedin"
  },
  {
   "value": "http://daimto.com/",
   "type": "contributor",
   "label": "Daimto - data import tutorials"
  },
  {
   "value": "https://github.com/LindaLawton",
   "type": "contributor",
   "label": "GitHub - projects"
  },
  {
   "value": "https://github.com/google/google-api-dotnet-client",
   "type": "contributor",
   "label": "Google APIs .Net client - GitHub"
  },
  {
   "value": "https://github.com/LindaLawton/Google-Dotnet-Samples",
   "type": "contributor",
   "label": "Google APIs .Net Samples - GitHub "
  },
  {
   "value": "https://developers.google.com/analytics/",
   "type": "other",
   "label": "Google Analytics"
  },
  {
   "value": "https://developers.google.com/",
   "type": "other",
   "label": "Google Developers"
  },
  {
   "value": "https://developers.google.com/experts/+LindaLawton",
   "type": "other",
   "label": "Google Developer Expert - Linda Lawton"
  }
 ],
 "objectType": "person",
 "id": "117200475532672775346",
 "displayName": "Linda Lawton",
 "name": {
  "familyName": "Lawton",
  "givenName": "Linda"
 },
 "tagline": "Google Developer Expert 2014 - 2017",
 "braggingRights": "Extreme Beekeeper first to recorded an Hive inspection using Google Glass with out a veil on.",
 "aboutMe": "\u003cdiv\u003e\u003cb\u003eBackground\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003e\u003cdiv\u003eI have been working as an application developer since 1995. I have worked with a number of database systems Oracle, Microsoft SQL Server, and MySQL.  In recent years I have been mainly working with Microsoft products, Visual Studio, SSIS, and C#.   I the past I worked a lot with web development PHP, JavaScript, Ajax, power-builder,  Cobol and ASP.net.\u003c/div\u003e\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eWhile I have done front end development in the past. I find working with backed development working on automated systems fascinating.    I have spent the last 5 years creating custom SSIS (Dlls), and services and APIs for the cloud (Azure).\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eGoogle API Addiction\u003c/b\u003e \u003c/div\u003e\u003cdiv\u003eIn 2012 I began working with the Google APIs, starting with the Google Analytics API.  I learned to appreciate the fact that Google is so open and willing to give us access to their systems. I started blogging about how to use the APIs writing short tutorials with sample projects.   \u003ca href=\"http://www.daimto.com/\" rel=\"nofollow\" target=\"_blank\"\u003eDaimto - Data Import Tutorials\u003c/a\u003e.   This along with my presents on a number of \u003ca href=\"http://stackoverflow.com/users/1841839/daimto\" rel=\"nofollow\" target=\"_blank\"\u003eDeveloper forms\u003c/a\u003e lead me to discovered by Google.  I became one of the first \u003ca href=\"https://developers.google.com/experts/+LindaLawton\" rel=\"nofollow\" target=\"_blank\"\u003eGoogle Developer Experts for Google Analytics\u003c/a\u003e.  \u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003eI also help support the \u003ca href=\"https://github.com/google/google-api-dotnet-client\" rel=\"nofollow\" target=\"_blank\"\u003eGoogle APIs client Library for .NET\u003c/a\u003e which provides simple, flexible, and powerful access to Google APIs such as Drive, YouTube, Calendar, Storage and Analytics.\u003c/div\u003e\u003cdiv\u003e\u003cbr /\u003e\u003c/div\u003e\u003cdiv\u003e\u003cb\u003eLife\u003c/b\u003e\u003c/div\u003e\u003cdiv\u003eI grew up in a small town in \u003ca href=\"http://en.wikipedia.org/wiki/Dartmouth,_Massachusetts\" rel=\"nofollow\" target=\"_blank\"\u003eMassachusetts\u003c/a\u003e, USA, I moved to \u003ca href=\"http://en.wikipedia.org/wiki/Denmark\" rel=\"nofollow\" target=\"_blank\"\u003eDenmark \u003c/a\u003ein 1998 and have lived here since. I have a 22 year old daughter.  My hobbies include reading science fiction, painting, and gardening.   \u003c/div\u003e",
 "url": "https://plus.google.com/+LindaLawton",
 "image": {
  "url": "https://lh5.googleusercontent.com/-a1CWlFnA5xE/AAAAAAAAAAI/AAAAAAAAdVM/sHkU9F-AwwQ/photo.jpg?sz=50",
  "isDefault": false
 },
 "organizations": [
  {
   "name": "Newberry College",
   "title": "computer science",
   "type": "school",
   "startDate": "1991",
   "endDate": "1994",
   "primary": false
  },
  {
   "name": "TARGIT",
   "title": "Business Intelligence Developer",
   "type": "work",
   "startDate": "2011",
   "primary": true
  },
  {
   "name": "Logimatic",
   "title": "developer",
   "type": "work",
   "startDate": "2008",
   "endDate": "2010",
   "primary": false
  }
 ],
 "placesLived": [
  {
   "value": "Aalborg Denmark",
   "primary": true
  },
  {
   "value": "Marathon Florida"
  },
  {
   "value": "Dartmouth Massachusetts"
  },
  {
   "value": "Ashford Connecticut"
  },
  {
   "value": "Nykøbing Mors Denmark"
  }
 ],
 "isPlusUser": true,
 "circledByCount": 2006,
 "verified": false,
 "cover": {
  "layout": "banner",
  "coverPhoto": {
   "url": "https://lh3.googleusercontent.com/t2ViXd7ar3MeiOCeTe2g86Qd7wOnbRvuf3eTW3LPrs8jwBJwKS6gsC4KWhvbRSytJ5fsDne3sw=s630-fcrop64=1,00000000ffffffff",
   "height": 528,
   "width": 940
  },
  "coverInfo": {
   "topImageOffset": 0,
   "leftImageOffset": 0
  }
 }
}

仅返回用户设置为public的内容。如果他们的电子邮件不公开,您将无法看到它。

答案 1 :(得分:1)

正如@DalmTo所提到的,API密钥可用于访问公共数据。如果您想要访问用户私人信息,您必须使用OAuth。

使用googleapis中的OAuth2班级设置身份验证:

const google = require('googleapis');
const OAuth2 = google.auth.OAuth2;

const CREDENTIALS = require("./credentials.json");

var googleAuth = new OAuth2(
  CREDENTIALS.web.client_id,
  CREDENTIALS.web.client_secret,
  CREDENTIALS.web.redirect_uris[0]
);

credentials.json是您可以从包含应用程序密钥的Google应用程序(凭据部分)下载的文件。

获得访问令牌后,您需要执行以下操作:

googleAuth.setCredentials({
  access_token: yourAccessToken
});

最后,不是使用auth: API_KEY,而是auth: googleAuth

plus.people.get({
    auth: googleAuth,
    userId: req.body.userID
}, function (err, user) {
    if( err ) { res.json( JSON.stringify( err ) );  return; }
    console.log(user.emails);
});

如果一切顺利,您应该能够从用户那里获取私人信息。

请注意,要访问电子邮件,您需要https://www.googleapis.com/auth/userinfo.email范围。

要获取用于测试的访问令牌,您可以使用OAuth游乐场:

  1. 打开https://developers.google.com/oauthplayground/
  2. 输入您需要的身份验证范围,然后单击蓝色按钮:

    它将进行一些重定向。

  3. 第2步中再次点击蓝色按钮,将授权码交换为访问令牌。

  4. 现在,您将在屏幕右侧看到access_token

    {
      "access_token": "ya29.G....OEDi", 
      "token_type": "Bearer", 
      "expires_in": 3600, 
      "refresh_token": "....hLA", 
      "id_token": ".....B1LGce02PMQHig"
    }
    

    您可以将其用于测试。在您的应用中实施OAuth2时,您需要按照OAuth2协议规则设置重定向。