代码之家  ›  专栏  ›  技术社区  ›  James Watkins

在node.js中使用jwt查看上传到驱动器的文档

  •  0
  • James Watkins  · 技术社区  · 7 年前

    我正在为用户建立一个门户网站,以便上传我的团队可以在Google Drive中查看和编辑的文档。因此,我正在使用JWT身份验证进行上载。

    我相信这段代码是有效的,因为我从GoogleAPI得到了一个成功的响应。但是,我无法确定文档存储在哪里,或者如何在驱动器UI中查看它们。

    例如,我尝试使用生成JWT凭据时使用的相同帐户登录驱动器,但文档不可见。

    请帮助纠正我对这个驱动器API集成如何工作的理解。

    1 回复  |  直到 7 年前
        1
  •  0
  •   James Watkins    7 年前

    解决方案是创建文档,然后与您自己的帐户共享,以便您可以在驱动器中查看文档。但是,当我第一次尝试时,我遇到了一些API问题,不允许我转移所有权。此外,我无法更改刚创建的文档的权限。因此,我可以授予编辑权限,并且必须在权限调用上实现重试逻辑。

    var googleapis = require('googleapis').google;
    var googleauth = require('google-auth-library');
    var fs = require('fs');
    var credentials = require('./credentials/google.json');
    
    var Google = {};
    
    Google.authorize = function() {
        return new Promise(function(resolve, reject) {
            var client = new googleauth.JWT({
                email: credentials.client_email,
                key: credentials.private_key,
                scopes: ['https://www.googleapis.com/auth/drive.file']
            });
    
            client.authorize(function(err, result) {
                if (err) {
                    console.log("Google.authorize "+err);
                    reject();
                } else {
                    resolve(client);
                }
            });
        });
    };
    
    Google.getDrive = function(auth) {
        return googleapis.drive({
            version: 'v3',
            auth: auth
        });
    };
    
    Google.createFile = function(drive, fileName, mimeType, stream) {
        return new Promise(function(resolve, reject) {
            drive.files.create({
                requestBody: {
                    name: fileName,
                    mimeType: mimeType
                },
                media: {
                    mimeType: mimeType,
                    body: stream
                }
            }, null, function (err, result) {
                if (err) {
                    console.log("Google.createFile "+err);
                    reject();
                } else {
                    var retry = function(id, waitTime) {
                        if (waitTime > 10000) {
                            reject();
                        }
                        setTimeout(function() {
                            drive.permissions.create({
                                fileId: id,
                                resource: {
                                    role: "writer",
                                    type: "user",
                                    emailAddress: "YOUR-EMAIL-HERE"
                                }
                            }, {
                            }, function(err, result) {
                                if (err) {
                                    console.log("Drive Permissions - Retrying after waiting "+waitTime);
                                    retry(id, waitTime*2);
                                } else {
                                    resolve(id);
                                }
                            });
                        }, waitTime);
                    };
    
                    var id = result.data.id;
                    console.log("Uploaded ID " + id);
                    retry(id, 1000);
                }
            });
        });
    };
    
    module.exports = Google;