从 Firebase 云函数访问 Google App Engine 端点
Access Google App Engine endpoint from Firebase cloud function
我有一个 firebase 云函数,它在 firebase 实时数据库发生变化时被触发。在云功能中,我想访问我的应用引擎端点。 App Engine 端点配置了仅 "admin" 访问的安全约束。 (注意:端点部署在与我的 firebase 云函数项目不同的应用引擎项目中。这两个项目都部署在同一个 google 云帐户中)
我尝试从云函数获取应用程序默认凭据并在对端点的 HTTP 请求中使用它,但它被重定向到登录页面。
firebase云函数的应用默认凭证有什么作用?是否有其他方法可以实现此目的?
Firebase 云函数:
const gal = require('google-auth-library');
exports.makeUppercase = functions.database.ref('/{deviceId}/status')
.onWrite(event => {
const auth = new gal.GoogleAuth();
try {
auth.getApplicationDefault().then(
function(res) {
let client = res.credential;
if (client.createScopedRequired && client.createScopedRequired()) {
const scopes = ['https://www.googleapis.com/auth/cloud-platform'];
client = client.createScoped(scopes);
}
console.log(client);
const url = 'https://my-secure-service-dot-my-project.appspot.com/secureEndPoint';
client.request({url}).then(
function(response) {
console.log(response.data);
}
).catch(err => {
console.error(err);
return err;
});
}
).catch(err => {
console.error(err);
return err;
});
} catch (e) {
console.error(e);
}
});
编辑:我将端点部署在与云功能项目相同的项目中。端点访问仍然失败
编辑:下面是 web.xml 部分,其中为端点指定了安全约束:
<security-constraint>
<web-resource-collection>
<web-resource-name>all</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>admin</role-name>
</auth-constraint>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
are two working examples for accessing a protected GAE endpoint by using Identity Aware Proxy(IAP)。 注意:IAP 将限制对整个应用程序的访问,而不是对特定处理程序的访问,如with login: admin
。
根据 app.yaml reference for standard login: admin
是真实用户使用浏览器连接到端点的媒介。
我有一个 firebase 云函数,它在 firebase 实时数据库发生变化时被触发。在云功能中,我想访问我的应用引擎端点。 App Engine 端点配置了仅 "admin" 访问的安全约束。 (注意:端点部署在与我的 firebase 云函数项目不同的应用引擎项目中。这两个项目都部署在同一个 google 云帐户中)
我尝试从云函数获取应用程序默认凭据并在对端点的 HTTP 请求中使用它,但它被重定向到登录页面。
firebase云函数的应用默认凭证有什么作用?是否有其他方法可以实现此目的?
Firebase 云函数:
const gal = require('google-auth-library');
exports.makeUppercase = functions.database.ref('/{deviceId}/status')
.onWrite(event => {
const auth = new gal.GoogleAuth();
try {
auth.getApplicationDefault().then(
function(res) {
let client = res.credential;
if (client.createScopedRequired && client.createScopedRequired()) {
const scopes = ['https://www.googleapis.com/auth/cloud-platform'];
client = client.createScoped(scopes);
}
console.log(client);
const url = 'https://my-secure-service-dot-my-project.appspot.com/secureEndPoint';
client.request({url}).then(
function(response) {
console.log(response.data);
}
).catch(err => {
console.error(err);
return err;
});
}
).catch(err => {
console.error(err);
return err;
});
} catch (e) {
console.error(e);
}
});
编辑:我将端点部署在与云功能项目相同的项目中。端点访问仍然失败
编辑:下面是 web.xml 部分,其中为端点指定了安全约束:
<security-constraint>
<web-resource-collection>
<web-resource-name>all</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>admin</role-name>
</auth-constraint>
<user-data-constraint>
<transport-guarantee>CONFIDENTIAL</transport-guarantee>
</user-data-constraint>
</security-constraint>
with login: admin
。
根据 app.yaml reference for standard login: admin
是真实用户使用浏览器连接到端点的媒介。