gpt4 book ai didi

node.js - 与应用程序一起分发 Google API 凭据是否安全?

转载 作者:行者123 更新时间:2023-12-03 12:29:59 25 4
gpt4 key购买 nike

我正在尝试制作一个简单的桌面 Electron 邮件阅读器(带 Electron ),它可以在可以翻阅的小卡片上显示用户的 Electron 邮件。没什么,这就是为什么我不想为其设置整个远程服务器系统。我按照 Google's NodeJS Quickstart guide 中的说明进行操作开始。这包括将我的 Google API 凭据保存到应用程序中的文件中。登录后, token 将保存到磁盘。如果不存在这样的 token ,它将在浏览器中打开一个登录页面,重定向到127.0.0.1:3000/authorize(在那里运行的express应用程序会保存 token )。它可以工作,并且不需要远程服务器,这正是我想要的。

我的问题是,使用我的应用分发 credentials.json 文件(包含 client_id、client_secret、project_id)是否安全?潜在的安全问题是什么?如果这不合适,那么让我的应用程序可以安全分发的最简单的替代方案是什么?

编辑

我查看了 Google 的文档,发现 this .

The process results in a client ID and, in some cases, a clientsecret, which you embed in the source code of your application. (Inthis context, the client secret is obviously not treated as a secret.)

所以在这种情况下 client_secret 并不是 secret ,对吧? credentials.json 的其余部分怎么样?有人可以冒充我的应用程序并使用该信息做坏事吗?

这是首次登录的代码(有效):

function getNewToken(oAuth2Client, callback, method, args) {
const authUrl = oAuth2Client.generateAuthUrl({
access_type: 'offline',
scope: SCOPES,
});

require('electron').shell.openExternal(authUrl);
// mini server for authorization

const express = require('express')()

//express part
express.get('/authorize', function (req, res) {
oAuth2Client.getToken(req.query.code, (err, token) => {
if (err) return console.error('Error retrieving access token', err);
oAuth2Client.setCredentials(token);
// Store the token to disk for later program executions
fs.writeFile(TOKEN_PATH, JSON.stringify(token), (err) => {
if (err) return console.error(err);
console.log('Token stored to', TOKEN_PATH);
});
method(oAuth2Client, callback, args);

});
res.sendFile(path.join(__dirname, 'authorize.html'));
});

express.listen(3000, () => {
console.log(`Example app listening at http://localhost:3000`)
})

}

以及我在保存 token 时用于访问 API 的函数:

function ApiCall(method, callback, args) {
fs.readFile('credentials.json', (err, content) => {
if (err) return console.log('Error loading client secret file:', err);
// Authorize a client with credentials, then call the Gmail API.
var credentials = JSON.parse(content);
var {client_secret, client_id, redirect_uris} = credentials.web;
var oAuth2Client = new google.auth.OAuth2(
client_id, client_secret, redirect_uris[0]);

// Check if we have previously stored a token.
fs.readFile(TOKEN_PATH, (err, token) => {
if (err) return getNewToken(oAuth2Client, callback, method, args);
oAuth2Client.setCredentials(JSON.parse(token));
method(oAuth2Client, callback, args);
});
});
}

最佳答案

以这种方式分发客户端 key 并不安全,因为攻击者很容易将其从您的应用程序中窃取。客户端 ID 可以安全地分发,其本身不足以发起攻击。您不需要项目 ID 即可进行授权。

您要实现的流程在 oAuth 中称为授权代码授予类型。您还需要实现 PKCE extension.总而言之,授权代码 + PKCE 是在最终用户设备上运行的 native 应用中使用 oAuth 的推荐方法。

谷歌 documents使用 OpenId Connect 将没有 PKCE 的授权代码作为“服务器流”(有点用词不当)。后者是 oAuth 的超集,以上所有内容仍然适用:

  1. Create an anti-forgery state token
  2. Send an authentication request to Google
  3. Confirm the anti-forgery state token
  4. Exchange code for accesstoken and ID token
  5. Obtain user information from the ID token
  6. Authenticate the user

您的申请中可能不需要步骤 5-6。

您可以尝试在 JS 中使用 google-api-nodejs-client 滚动步骤 1-4或者你可以给 oidc-client-js一枪。

关于node.js - 与应用程序一起分发 Google API 凭据是否安全?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66214809/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com