首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对Google API的REST请求进行身份验证

对Google API的REST请求进行身份验证
EN

Stack Overflow用户
提问于 2021-05-22 04:32:52
回答 1查看 67关注 0票数 0

我在对Google API的REST请求进行身份验证时遇到问题。通常,Google都有客户端包为您完成此操作。

现在,我正在使用文档翻译服务,它还在预览中,所以我不能使用这个包。当涉及到对REST请求进行身份验证时,文档确实令人困惑。当我使用一个包时,我用这个模板给它一个JSON凭证文件:

代码语言:javascript
复制
{
  "type": "xxx",
  "project_id": "xxx",
  "private_key_id": "xxx",
  "private_key": "xxx",
  "client_email": "xxx",
  "client_id": "xxx",
  "auth_uri": "xxx",
  "token_uri": "xxx",
  "auth_provider_x509_cert_url": "xxx",
  "client_x509_cert_url": "xxx"
}

我是否可以发送REST请求并仅使用其中的一些数据进行身份验证,就像我使用客户端包时一样?我在一些地方看到,我应该使用这些数据生成一个令牌,并使用一个令牌进行身份验证。我需要生成和使用令牌吗?如果是,如何在NodeJS中创建令牌?

EN

回答 1

Stack Overflow用户

发布于 2021-05-22 08:32:38

我相信你的现状和你的目标如下。

  • 你有服务帐户的凭证文件。
  • 你想使用服务帐户使用Google。
  • 你想要使用Node.js来实现这一点。但是,您并不想使用googleapis for Node.js。您希望在不使用Node.js的googleapis的情况下使用此服务帐户。
  • 您的问题有以下两个问题。
    1. 我是否可以发送REST请求并仅使用其中的一些数据进行身份验证,就像我使用客户端包时一样?
    2. 我是否需要生成和使用令牌?如果是,如何在NodeJS?

中创建令牌

问题1的答案:

我认为这是肯定的。

问题2的答案:

我认为这是肯定的。为了使用服务帐户使用Google API,需要使用服务帐户检索访问令牌。从服务帐户检索访问令牌而不使用Node.js的googleapis的示例脚本如下所示。

示例脚本:

在本例中,使用了cryptorequest两个库。另外,请设置privateKeyclientEmail。此脚本来自this post

代码语言:javascript
复制
const cryptor = require('crypto');
const request = require('request');

const privateKey = "-----BEGIN PRIVATE KEY-----\n###-----END PRIVATE KEY-----\n"; // private_key of JSON file retrieved by creating Service Account
const clientEmail = "###"; // client_email of JSON file retrieved by creating Service Account

const scopes = ["https://www.googleapis.com/auth/drive.readonly"]; // Sample scope

const url = "https://www.googleapis.com/oauth2/v4/token";
const header = {
  alg: "RS256",
  typ: "JWT",
};
const now = Math.floor(Date.now() / 1000);
const claim = {
  iss: clientEmail,
  scope: scopes.join(" "),
  aud: url,
  exp: (now + 3600).toString(),
  iat: now.toString(),
};

const signature = Buffer.from(JSON.stringify(header)).toString('base64') + "." + Buffer.from(JSON.stringify(claim)).toString('base64');

var sign = cryptor.createSign('RSA-SHA256');
sign.update(signature);
const jwt = signature + "." + sign.sign(privateKey, 'base64');

request({
  method: "post",
  url: url,
  body: JSON.stringify({
    assertion: jwt,
    grant_type: "urn:ietf:params:oauth:grant-type:jwt-bearer",
  }),
}, (err, res, body) => {
  if (err) {
    console.log(err);
    return;
  }
  console.log(body);
});

  • 在此示例中,使用https://www.googleapis.com/auth/drive.readonly作为示例作用域。关于这一点,请根据实际情况修改作用域。

结果:

当运行上述脚本时,将返回以下值。您可以使用此值中的访问令牌,并可以使用此访问令牌来使用Google API。

代码语言:javascript
复制
{
  "access_token":"###",
  "expires_in":3599,
  "token_type":"Bearer"
}

注意:

  • 作为一个重要的要点,例如,当您使用Google Drive API使用此脚本时,Drive of service帐户与您的Google Drive不同。请当心这个。当您要使用服务帐户使用硬盘上的文件时,需要与服务帐户的电子邮件共享该文件。

参考文献:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67643538

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档