我正在尝试使用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);