electron Google Web授权代理和电子桌面应用程序

yrefmtwq  于 2022-12-08  发布在  Electron
关注(0)|答案(2)|浏览(398)

背景说明:
我的项目由一个Vue 2前端和一个asp.net核心Web API后端组成。
我想做的是得到一个谷歌授权令牌和刷新令牌,这样我就可以在用户的谷歌驱动器上创建一个文件夹和该文件夹中的文件。我还想在我的前端显示文件夹内容的列表。
我已经尝试在我的前端使用新的谷歌身份服务代码,但当启动我的应用程序并点击谷歌按钮时,我出现以下错误

Error 400: invalid_request

If you’re the app developer, make sure that these request details comply with Google policies:

redirect_uri: storagerelay://file/?id=auth12850

我认为这是因为电子被认为是一个桌面应用程序,根据谷歌文档需要使用一个环回地址打开系统浏览器,并从那里进行身份验证。
因此,我在我的后端尝试了谷歌身份验证API,这是C#,我有谷歌Web授权代理设置,当我运行我的后端并调用我的端点时,我会得到谷歌登录页面,并可以获得授权令牌和刷新令牌。
问:是否有一种方法可以捕获要进行身份验证的页面的URL,以便我可以将其放在电子版的子窗口中。
或者将数据传递到前端以便向用户显示文件列表的方法。
即使我从Web代理获得身份验证页面,我是否仍需要使用环回地址?
如果我确实需要回送功能,使用来自Google桌面应用程序示例的数据比使用Google Web代理更好吗?
要了解更多关于电子的信息,你可以访问Electron website

t98cgbkg

t98cgbkg1#

对于一个网络应用程序,我认为你会有一个问题
用户通过Google验证后将被重定向到此路径。此路径将附加访问授权码,并且必须具有协议。它不能包含URL片段、相对路径或通配符,也不能是公共IP地址。
不仅仅是因为格式,而是因为它需要是一个你可以注册的域。
如果使用已安装的应用程序,则重定向URI为https://127.0.0.1
我不知道你怎么才能把这个正确地送回来。

yeotifhr

yeotifhr2#

我最终使用了nodejsgoogleapi来实现这一点,这是我的代码,现在返回一个auth令牌和刷新令牌。
这段代码在点击authorize按钮时打开一个子窗口,并加载google login/account select。一旦授权,它就会显示应用程序权限窗口。当用户点击allow时,url会在所创建服务器的环回中被调用,auth文件会在指定的目录中创建。
第一部分成功了。。现在开始让其他一切正常工作。

/* Google authentication */
function createGoogleWindow() {

    const http = require('http');
    const path = require('path');
    const service = google.drive('v3');
    const TOKEN_DIR = path.join(process.env.APPDATA, 'home-inventory', 'bin');
    const TOKEN_PATH = path.join(TOKEN_DIR, 'home-inventory.json');
    const querystring = require('querystring');

    let googleWindow = new BrowserWindow({
        parent: win,
        height: 600,
        width: 400,
        webPreferences: {
            webSecurity: false,
            nodeIntegration: true,
            enableRemoteModule: true,
            contextIsolation: false
        }
    });
    if (isDevelopment) googleWindow.webContents.openDevTools();
    googleWindow.menuBarVisible = false;
    googleWindow.on('closed', () => {
        googleWindow = null;
    });

    const oauth2Client = new google.auth.OAuth2(
        CLIENT_ID,
        CLIENT_SECRET,
        REDIRECT_URI
    );
    // check if we previously stored a token
    fs.readFile(TOKEN_PATH, function (err, token){
        if (err) {
            getNewToken(oauth2Client);
        } else {
            oauth2Client.credentials = JSON.parse(token);
            callback(oauth2Client);
        }
    });
    
    const url = oauth2Client.generateAuthUrl({
        access_type: 'offline',
        scope: SCOPES
    });

    function callback (auth) {
        service.files.list({
            auth: auth,
            q: `name contains '.bak'`,
            pageSize: 50,
            fields: "nextPageToken, files(id,name,size,parents,createdTime)",
        }, function(err, response) {
            if (err) {
                console.error('The API returned an error: ', err);
                return;
            }
            const files = response.files;
            if (files.length === 0) {
                console.warn('no files found');
            } else {
                console.warn('files', files, auth.credentials.access_token);
            }
        });
    }

    function getNewToken(oauth2Client, callback) {
        function storeToken(token) {
            try {
                fs.mkdirSync(TOKEN_DIR);
            } catch (err) {
                if (err.code !== 'EEXIST') {
                    throw err
                }
            }
            fs.writeFile(TOKEN_PATH, JSON.stringify(token), (err) => {
                if (err) {
                    throw err;
                }
                // console.debug('file was saved successfully');
                googleWindow.close();
            });
            // console.warn('Token stored to: ', TOKEN_PATH);
        }

        function handler(request, response, server, callback) {
            let qs = querystring.parse(require('url').parse(request.url).query);
            oauth2Client.getToken(qs.code, function (err, tokens) {
                if (err) {
                    console.error('Error getting oAuth tokens: ', err);
                }
                oauth2Client.credentials = tokens;
                storeToken(tokens);
                callback(oauth2Client)
                server.close();
            });
        }

        const server = http.createServer(function (request, response) {
            handler(request, response, server, callback);
        }).listen(8181, function() {
            googleWindow.loadURL(url);
        })
    }
}

相关问题