当前位置: 首页 > 知识库问答 >
问题:

域内的Google Drive API服务帐户

阳念
2023-03-14

我必须下载/上传/删除文件从一个文件夹驱动器与Node.js服务器。该文件夹位于公司的谷歌办公套件内,公司中只有少数人可以访问。

我必须使用一个服务帐户来做这件事,问题是:这可能吗?我该怎么做?

我已经读过了https://developers.google.com/drive/v2/web/delegation和https://developers.google.com/identity/protocols/OAuth2ServiceAccount但我不知道是否有可能授予服务帐户访问公司域内文件夹的权限,因为服务帐户是@developer。gserviceaccount。com和该公司的域是另一个域,所以当我尝试将该服务帐户添加到文件夹时,会出现错误。

如果你能在这方面指导我,我将非常感激。

谢谢!

共有1个答案

狄望
2023-03-14

您可以使用具有以下权限范围的oAuth令牌:

const path = require('path');

module.exports = (app) => {
    const factory = {};
    factory.connect = (done) => {
        const fs = require('fs');
        const google = require('googleapis');
        const googleAuth = require('google-auth-library');

        const SCOPES = [
            'https://www.googleapis.com/auth/drive.metadata.readonly'
        ];
        const TOKEN_DIR = path.resolve(app.root, 'server','config');
        const TOKEN_PATH = path.resolve(TOKEN_DIR,'token.json');

        const creds = require(path.resolve(app.root, 'server', 'config', 'google_oauth.json'));
        authorize(creds, (ret) => {
            done(null, ret);
        });

        /**
         * Create an OAuth2 client with the given credentials, and then execute the
         * given callback function.
         *
         * @param {Object} credentials The authorization client credentials.
         * @param {function} callback The callback to call with the authorized client.
         */
        function authorize(credentials, callback) {
            const clientSecret = credentials.installed.client_secret;
            const clientId = credentials.installed.client_id;
            const redirectUrl = credentials.installed.redirect_uris[0];
            const auth = new googleAuth();
            const oauth2Client = new auth.OAuth2(clientId, clientSecret, redirectUrl);

            // Check if we have previously stored a token.
            fs.readFile(TOKEN_PATH, function (err, token) {
                if (err) {
                    console.error('[ERROR] Unable to read token', err)
                    getNewToken(oauth2Client, callback);
                } else {
                    oauth2Client.credentials = JSON.parse(token);
                    callback(oauth2Client);
                }
            });
        }

        /**
         * Get and store new token after prompting for user authorization, and then
         * execute the given callback with the authorized OAuth2 client.
         *
         * @param {google.auth.OAuth2} oauth2Client The OAuth2 client to get token for.
         * @param {getEventsCallback} callback The callback to call with the authorized
         *     client.
         */
        function getNewToken(oauth2Client, callback) {
            const authUrl = oauth2Client.generateAuthUrl({
                access_type: 'offline',
                scope: SCOPES
            });
            console.log('Authorize this app by visiting this url: ', authUrl);
            const readline = require('readline');
            const rl = readline.createInterface({
                input: process.stdin,
                output: process.stdout
            });
            rl.question('Enter the code from that page here: ', function (code) {
                rl.close();
                oauth2Client.getToken(code, function (err, token) {
                    if (err) {
                        console.log('Error while trying to retrieve access token', err);
                        return;
                    }
                    oauth2Client.credentials = token;
                    storeToken(token);
                    callback(oauth2Client);
                });
            });
        }

        /**
         * Store token to disk be used in later program executions.
         *
         * @param {Object} token The token to store to disk.
         */
        function storeToken(token) {
            try {
                fs.mkdirSync(TOKEN_DIR);
            } catch (err) {
                if (err.code != 'EEXIST') {
                    throw err;
                }
            }
            fs.writeFile(TOKEN_PATH, JSON.stringify(token));
            console.log('Token stored to ' + TOKEN_PATH);
        }

    };
    return factory
};

然后是工厂。连接(完成)将给done一个auth来使用googleapis

                const google = require('googleapis');
                const service = google.drive('v3');
                service.files.list({
                    auth,
                    pageSize: 10,
                    fields: 'nextPageToken, files(id, name)'
                }, step);
 类似资料:
  • 我试图使用我的应用程序的服务帐户访问我域中所有用户的所有文档,遵循以下指示: https://developers.google.com/drive/development但是它没有工作。你能帮我解决这个问题吗??我试着跟着网址- http://iambusychangingtheworld.blogspot.co.uk/2013/12/google-drive-api-how-work-with

  • 文档建议将服务帐户添加到GApps的第三方oauth访问列表必须由域管理员手动完成:https://developers.google.com/drive/delegation#delegate_domain-wide_authority_to_your_service_account 有没有一种方法可以通过身份验证页面来实现这一点?

  • 我正在构建一个需要读取普通Gmail收件箱(不是域的一部分)的Web服务。 代码: 错误: 我看不出这有什么原因不起作用,但读完这篇文章后,你似乎不能在个人@gmail帐户上使用服务帐户凭据。有谁知道这是真的还是我做错了什么? 感谢您的帮助! 更新 如果我将更改为,我可以查看邮件,但无法修改标签,这是我的要求。

  • 我正在使用谷歌服务帐户将MySQL备份从我们的网络服务器推送到谷歌云端硬盘,使用谷歌API PHP客户端脚本设置为cron作业。 我现在想在多个网络服务器上运行相同的脚本,我不知道如何正确配置服务号,应该吗? > 是否在所有服务器上使用相同的服务帐户和服务帐户密钥/凭据? 或者使用相同的服务帐户,但为每个服务器添加服务帐户密钥/凭据? 还是为每台服务器设置单独的服务帐户?

  • 我正在尝试通过服务帐户(客户端电子邮件和p12证书)连接到google doubeclick api,使用python客户端库,如以下示例所示: http://code.google.com/p/google-api-python-client/source/browse/samples/service_account/tasks.py 它给我一个空access_token: 这有什么意义?我有没

  • 我想用gmail API阅读我的gmail收件箱。我需要使用服务帐户,因为我的应用程序没有用户交互。我在请求时收到以下错误: 这是我的代码: 我做错了什么?有人能帮我吗? 当做