如何从OAuth2 Google API获取电子邮件和个人资料信息?

时间:2017-04-26 21:31:15

标签: node.js google-api oauth-2.0

我尝试使用OAuth2 API使用Google API Node.js客户端检索已登录用户的名称。

按照用法示例,我设法登录,但我找不到获取个人资料信息的方法。

我没有使用People API或Plus API,因为据我所知,OAuth2包含https://www.googleapis.com/auth/userinfo.profile,这应该足以完成任务。

我已经看到了一些类似的问题并尝试了这个问题的解决方案,但它没有用,可能它太旧了(?)

With the npm package googleapis how do I get the user's email address after authenticating them?

查看其他API,例如Google表格,可以像这样调用他们的功能:

var google = require('googleapis');
var sheets = google.sheets('v4');

...

sheets.spreadsheets.values.get({
    auth: auth,
    spreadsheetId: file_id,
    range: my_ranges,
  }, function(err, response){
       ...
     }
);

但似乎OAuth2并不像那样......

3 个答案:

答案 0 :(得分:5)

您可以将quickstart用于node.js.详细信息为https://developers.google.com/gmail/api/quickstart/nodejs。使用Quickstart中的示例脚本,您可以通过OAuth2检索访问令牌,并检索电子邮件和用户配置文件。

在运行快速入门示例之前,请确认先决条件,步骤1和步骤2.

您可以按如下方式更改listLabels(auth)。范围是https://www.googleapis.com/auth/gmail.readonly

脚本:

var gmail = google.gmail({
        auth: auth,
        version: 'v1'
});

gmail.users.getProfile({
    auth: auth,
    userId: 'me'
    }, function(err, res) {
    if (err) {
        console.log(err);
    } else {
        console.log(res);
    }
});

gmail.users.messages.get({
    'userId': 'me',
    'id': 'mail ID',
    'format': 'raw'
}, function (err, res) {
    console.log(new Buffer(res.raw, 'base64').toString())
});
  • gmail.users.getProfile检索用户个人资料。
  • gmail.users.messages.get检索电子邮件。

如果我误解了你的问题,我很抱歉。

已添加:

请将以上内容更改为以下脚本。范围是https://www.googleapis.com/auth/userinfo.profile

脚本:

var oauth2 = google.oauth2({
        auth: auth,
        version: 'v2'
});

oauth2.userinfo.v2.me.get(
function(err, res) {
    if (err) {
        console.log(err);
    } else {
        console.log(res);
    }
});

结果:

{
  id: '#####',
  name: '#####',
  given_name: '#####',
  family_name: '#####',
  link: '#####',
  picture: '#####',
  gender: '#####',
  locale: '#####'
}

答案 1 :(得分:1)

您还可以查看PassportJS。他们有多种策略,包括OAuth2和3种不同的Google Auth策略。我的回答并没有真正回答你的问题,但即使看看Passport的代码,你也可以得到答案。

http://passportjs.org/

答案 2 :(得分:0)

2021 年解决方案

这个答案可能会偏离最初提出的问题,但我认为对于一些通过生成 AuthUrl 并将其发送到客户端然后在调用中接收数据响应在后端获取 google 用户信息的人来说,这将是有用的用户给客户端权限后返回的URL。

一些全局声明

import { google } from "googleapis";
const Oauth2Client = new google.auth.OAuth2(
  googleCredentials.CLIENT_ID,
  googleCredentials.CLIENT_SECRET,
  googleCredentials.REDIRECT_URI
);

生成具有范围的 Auth URL

const SCOPE = [
  'https://www.googleapis.com/auth/userinfo.profile', // get user info
  'https://www.googleapis.com/auth/userinfo.email',   // get user email ID and if its verified or not
];
const auth_url = Oauth2Client.generateAuthUrl({
  access_type: "offline",
  scope: SCOPE,
  prompt: "consent",
  state: "GOOGLE_LOGIN",
});
return res.json({ url: auth_url });    // send the Auth URL to the front end

在回调中获取用户数据

let code = req.query.code;    // get the code from req, need to get access_token for the user 
let { tokens } = await Oauth2Client.getToken(code);    // get tokens
let oauth2Client = new google.auth.OAuth2();    // create new auth client
oauth2Client.setCredentials({access_token: tokens.access_token});    // use the new auth client with the access_token
let oauth2 = google.oauth2({
  auth: oauth2Client,
  version: 'v2'
});
let { data } = await oauth2.userinfo.get();    // get user info
console.log(data);    // you will find name, email, picture etc. here

如果有任何混淆或错误,请随时在评论中讨论