- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我在 Google 表格上有一些数据。我正在使用 Sheets API for Node.js访问此数据。对于身份验证,我使用服务帐户 JSON 生成 JWTClient。
我可以从工作表 api 访问数据,一切正常。代码托管在 Google App Engine Flexible environment 上.它适用于本地主机和 GAE。
唯一的问题是我需要提供服务帐户 key json 进行身份验证。这在本地环境中很好,但在 App Engine 上它提供了一个 default credential对于服务帐户(我使用的是相同的服务帐户)。所以我认为我不应该手动提供凭据并让 GAE 处理服务器上的凭据。
但它不会自动进行身份验证,仍然是一个身份验证参数。
这是我当前对工作表 api 的实现 -
const { promisify } = require('util');
const google = require('googleapis');
const auth = require('./auth');
const credentials = require('../configs/credentials');
const sheets = google.sheets('v4');
const getSheetValuesAsync = promisify(sheets.spreadsheets.values.get);
//region private
function readSheet(params) {
return getSheetValuesAsync(params);
}
//endregion private
//region public
async function get(sheetConfigName) {
const sheetConfig = credentials.sheets[sheetConfigName];
//This is theJWTClient which authenticates the api request currently.
//I want to remove this
const authClient = await auth.authorizeWithServiceAccount('serviceAccountName', [
'https://www.googleapis.com/auth/spreadsheets.readonly'
]);
console.log('Client received');
let params = {
auth: authClient, //I tried removing this parameter, but it didn't work
spreadsheetId: sheetConfig.id,
range: 'A:M'
};
let data = await readSheet(params);
return data;
}
//endregion public
module.exports = {
get: get
};
我得到的错误如下:-
{
code:403,
message: 'The request is missing a valid API key.
}
我已经为本地环境设置了 GOOGLE_APPLICATION_CREDENTIALS
环境变量,它已经适用于 google-cloud API,但不适用于工作表。
那么 Application Default Credentials
是仅用于 google-cloud API 还是可以与 Sheets API 或任何其他 Drive API 一起使用?如果它也可以与驱动器 API 一起使用,如何实现?
最佳答案
在 Google 的 Node.js 客户端包 (28.x) 的最新更新中,他们有一种无需第二个包即可获取 authClient 的新方法。这是它是如何完成的 -
const { google } = require('googleapis');
const authClient = await google.auth.getClient({
credentials: credentials,
scopes: scopes
});
credentials
只是服务帐户 JSON 对象。最好的部分是,如果您不提供该属性,它将检查 GOOGLE_APPLICATION_CREDENTIALS
环境变量,该变量将包含服务帐户 key JSON 的绝对路径,并自动将其用于身份验证。
您可以通过以下任一方式使用生成的 authClient 为 google sheets API 设置 auth 参数 -
首先是当您想为不同的 API 调用提供不同的身份验证时。
const { google } = require('googleapis');
const sheets = google.sheets('v4');
sheets.spreadsheets.values.getAsync = promisify(sheets.spreadsheets.values.get);
sheets.spreadsheets.values.getAsync({
auth: authClient,
spreadsheetId: spreadsheetId,
range: range
});
或者您可以直接向工作表对象提供授权。该对象上的所有 API 调用都将使用相同的 authClient,并且不需要 auth 参数。
const sheets = google.sheets({version:'v4',auth:authClient);
最好的方法是为所有 Google API 调用设置默认身份验证,这样您就不必将 authClient 传递给任何工作表对象或 API 调用。
google.options({
auth: authClient
});
如果您计划为不同的 API 使用不同的服务帐户,您仍然可以在工作表(或驱动器或任何其他对象)API 对象或特定的任何 API 调用中覆盖 auth 参数。
要在本地进行测试,您始终可以设置环境路径,这样您实际上不必将服务帐户传递给 google.auth
对象。这是我的做法
let resolve = require('path').resolve;
if (process.env.NODE_ENV === 'production') {
//Set config based on production environment. It won't be set in local environment, unless you specially set it.
} else if (!process.env.GOOGLE_APPLICATION_CREDENTIALS) {
process.env.GOOGLE_APPLICATION_CREDENTIALS = resolve(
'./relative/path/to/the/json/key.json'
); //resolve will just convert relative path to the absolute path.
}
关于javascript - 使用默认凭据访问 Google 表格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49563586/
我有一个问题,我不断收到错误 没有为“svn.ssl.server”凭据注册的提供者 我正在使用在另一台 SVN 服务器上工作的相同代码,但我设置的新服务器似乎无法连接,即使我可以通过 Web 浏览器
如何通过 shell 在 Hudson 中输入 subversion 凭据? 我尝试在 HUDSON_HOME 中生成文件 hudson.scm.SubversionSCM.xml 并重新加载配置,但
我正在尝试使用 powershell 访问远程注册表,如下所示: $reg = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey("LocalMachi
我需要将凭据存储在 powershell 中以便多次使用。 StackOverflow 上有很多例子,所以我拿了一个 $tmpCred = Get-Credential $tmpCred.Passwo
我遇到了 youtube java 凭据的问题,通常它运行良好并且我能够上传到 youtube,但今天我收到此异常无效的凭据。 YouTubeService service = new YouTube
我正在阅读中提供的 Hadoop 凭证文档 https://hadoop.apache.org/docs/current/hadoop-project-dist/hadoop-common/Crede
我想知道在为 MySQL 凭据/主机创建变量时最佳做法或建议做什么。 define('HOST', 'localhost'); // etc.. mysql_connect(HO
我试图让 Jenkins 从 BitBucket 克隆我的 mercurial 项目。它不会,因为它说凭据有问题 - 好吧,bitbucket 拒绝 Jenkins 提供的任何内容。 我几乎 100%
这里有一百万篇关于如何使用 git 缓存凭据的帖子。但是,如果机器重新启动,它们似乎都不成立。有没有办法缓存在机器重新启动时持续的凭据? 最佳答案 是的,在 Debian 和 Ubuntu 上,您可以
我正在尝试在我的环境中为 IIS 节点使用共享配置,我想使用组托管服务帐户凭据来实现这一目标。 当我将应用程序池的凭据应用为 MyDomain\GmsaAccount$ 时,它运行良好,但是当我尝试在
我创建了一个应用程序,它充当 2 个不同 API(WebEx 和 Exchange Web 服务)和电子邮件之间的桥梁。用户向一个特殊的电子邮件地址发送日历邀请,该应用程序解析 ICS 并创建一个 W
我正在尝试将凭据从 Jenkins 迁移到另一个凭据存储。 我想从 Jenkins 商店读取凭据,并找到了这个脚本 ( https://github.com/tkrzeminski/jenkins-g
我有一个在 Windows 上运行的 Jenkins 服务器。它将用户名:密码存储在凭据插件中。这是一个定期更新密码的服务用户。 我正在寻找一种运行脚本的方法,最好是 Powershell,它将更新
我想知道如何创建 Jenkins 和 Jenkins 中运行的作业可以使用的凭据以连接到 3rd 方服务。 最佳答案 您应该指定您将使用的第 3 方服务。 以下是带有 的凭据示例bitbucket 我
我正在一个网站上工作,我们希望使用 Spring Security Kerberos 使用 Kerberos 身份验证。所以,我们不支持 NTLM。当用户发出未经身份验证的请求时,服务器将回复带有 h
如果我设置 git config --global credential.username my_username 选项,然后使用 --local 选项覆盖一个存储库,这并没有什么区别 - 它在尝试提
我正在尝试使用需要 gce_client_id 和 gce_client_secret key 的第 3 方应用程序。为了生成它们,我浏览了凭据图标并尝试创建一个 OAuth 2.0 客户端 ID。但
我在使用 Azure 时遇到身份验证问题。我有一个运行 powershell 脚本的连续构建服务器,我收到如下消息: Your Azure credentials have not been set
首先,我想说我在安全和身份验证方面的知识非常有限。 我有一个应用程序可以从 docker store 中提取和运行容器。这是一个私有(private)仓库,所以我需要传递用户名和密码,以便用户可以拉取
我使用 Google 文档中的代码(如下所示)来管理 Google 日历。 public class CalendarQuickstart { private static final Str
我是一名优秀的程序员,十分优秀!