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

时间:2014-04-20 11:08:43

标签: node.js api authentication google-api jwt

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

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

我对JWT有一个非常基本的了解,但是OAuth2 page上的服务部分建议你应该使用他们的一个库来完成它,而不是自己实现它。但是,他们没有在supported libraries中列出节点库。

进一步挖掘并且我遇到了Google API Nodejs客户端:https://github.com/google/google-api-nodejs-client声称受Google支持并且开箱即用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;
}

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

我假设:

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

之前有没有人使用过这项服务,或者能够对这里的差异有所了解?

作为参考,这必须是服务器端,因为我需要对自治请求进行身份验证,并且我不能仅使用未经身份验证的请求,因为我在200个请求中超过了我的每日允许量(或类似的东西)

2 个答案:

答案 0 :(得分:11)

我设法将一个有效的解决方案拼凑在一起,所以我将其留在这里,以备将来遇到类似问题的其他人使用。

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]视为调试信息。

希望图书馆尽快得到一些适当的文档注意,这样的问题将被解决。

答案 1 :(得分:1)

上面的接缝示例已过时,因此我附加了发现的内容。除该库的智能感知外,没有任何好的文档。我在示例中使用的是pubsub:

entityMentionIndex