Nodejs中使用Google API进行服务身份验证



我正在尝试使用YouTube Data API V3 with Node,试图在进行视频搜索时提供经过身份验证的代理。由于服务将在服务器上运行,我创建了一个服务帐户。

这将导致下载密钥文件和以下信息:

我对JWT有一个非常基本的理解,但OAuth2页面上的服务部分建议您应该使用他们的一个库来实现它,而不是自己实现它。但是,它们不会在其支持的库中列出节点库。

经过进一步挖掘,我发现了Google API Nodejs客户端:https://github.com/google/google-api-nodejs-client它声称得到了谷歌的支持,并提供了开箱即用的OAuth2支持。

文档非常少,身份验证的示例包括将URL打印到终端中,然后在浏览器中访问它以生成令牌。我对源代码进行了挖掘,看看它是否支持JWT,而且它似乎确实内置了JWTClient

/**
 * @constructor
 * JWT service account credentials.
 *
 * Retrieve access token using gapitoken.
 *
 * @param {string=} email service account email address.
 * @param {string=} keyFile path to private key file.
 * @param {array=} scopes list of requested scopes.
 * @param {string=} subject impersonated account's email address.
 *
 */
function JWT(email, keyFile, key, scopes, subject) {
  JWT.super_.call(this);
  this.email = email;
  this.subject = subject;
  this.keyFile = keyFile;
  this.key = key;
  this.scopes = scopes;
  this.GAPI = GAPI;
}

构造函数上面的这个文档注释似乎是这里唯一的解释,我仍然不确定如何使用这个函数。

我假设:

  • email是您的开发人员帐户的电子邮件地址
  • keyFile是私钥的路径
  • key是私钥吗?(如果是,为什么还要包括路径?)
  • scopes是要访问的API作用域的数组
  • subject

以前有人使用过这项服务吗,或者能够了解一下这里的差异吗?

作为参考,这必须是服务器端的,因为我需要对请求进行身份验证以实现自主,而且我不能只使用未经身份验证的请求,因为我每天超过200个请求(或类似的请求)。

我已经设法拼凑出一个有效的解决方案,所以我将把它留给将来有类似问题的其他人。

repo中有一个JWT示例,它更详细地展示了如何使用JWT对象的构造函数。

https://github.com/google/google-api-nodejs-client/blob/master/examples/jwt.js

这是文档注释的一个稍微修改过的版本。

/**
 * @constructor
 * JWT service account credentials.
 *
 * Retrieve access token using gapitoken.
 *
 * @param {string=} email service account email address from developer console.
 * @param {string=} keyFile absolute path to private key file.
 * @param {string=} key the contents of the key if you are loading it yourself (optional)
 * @param {array=} scopes list of requested scopes.
 * @param {string=} subject impersonated account's email address (optional).
 *
 */

完成的代码看起来像这个

// Create the JWT client
var authClient = new googleapis.auth.JWT(email, keypath, key,
  ['https://www.googleapis.com/auth/youtube']);
// Authorize it to produce an access token
authClient.authorize(function(err, tokens) {
  if(err) throw err;
  // Use discovery to get the youtube api
  googleapis.discover('youtube', 'v3')
  .execute(function(err, client) {
    // Create a search
    var search = client.youtube.search.list({
      q: '<query string>',
      part: 'snippet',
      maxResults: 50
    });
    // Authenticate with current auth client
    search.authClient = authClient;
    // Hey presto!
    search.execute(function(err, results) {
      if(err) throw err;
      console.log(results.items);
    });
  });
});

这个代码示例一团糟,但它足以让您了解这个想法。基于你应该能够做的例子:

client.youtube.search.list({
 ... 
})
.withAuth(authClient)
.execute(...); 

但由于某些原因,withAuth方法并不存在。它花了一些时间才弄清楚它做了什么,据我所见,如果手动设置authClient属性,它可以正常工作,如上所示。

附带说明一下,err参数不是错误,但POJO和如上所述抛出它们实际上并不起作用。除非您很高兴看到[Object object]作为您的调试信息。

希望这个库能很快得到一些适当的文档关注,这样的问题就会得到解决。

上面的样本已经过时了,所以我附上了我发现的。对于图书馆来说,除了intellisense之外,没有什么好的文档。我在我的例子中使用pubsub:

const {google} = require('googleapis');
const path = require('path');
const util = require('util')

async function runSample () {
  // Create a new JWT client using the key file downloaded from the Google Developer Console
  const authClient = await google.auth.getClient({
    keyFile: path.join(__dirname, 'jwt.keys.json'),
    scopes: 'https://www.googleapis.com/auth/pubsub'
  });
  // Obtain a new pubsub client, making sure you pass along the authClient
  const pb = google.pubsub(
    {
        version:'v1',
        auth: authClient
    });
  //make a request to list subscriptions
  //the returned object is a axios response object
  const res = await pb.projects.subscriptions.list(
  {
      project: 'projects/my-project'
  });
  //return response data
  return res.data;
}
runSample().then(res =>{
    console.log(util.inspect(res, false, null))
}).catch(console.error);

相关内容

  • 没有找到相关文章

最新更新