我正在尝试将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个请求中超过了我的每日允许量(或类似的东西)
答案 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