【发布时间】:2013-10-23 14:27:20
【问题描述】:
对于我当前的项目,我想同时使用 Cloud Endpoints 和 Cloud Storage API。
当您对云端点进行身份验证时,来自 Google 的示例井字游戏应用程序声明应将 access_token 设置为 id_token,如下所示(请参阅github repository):
var token = gapi.auth.getToken();
// Use id_token instead of bearer token
token.access_token = token.id_token;
但是,一旦将 access_token 设置为 id_token,就不能再使用其他 google api。就我而言,云存储 API。原因是访问令牌现在对他们无效。例如,云存储 api 返回 Invalid credential。
在将 access_token 设置为 id_token 之前,access_token 如下所示:ya29.AHES6ZTjklghkljghlkjfghkljsrdölizuklhlfghI_UTfghdfghCg。它被替换为我不想在此处发布的 id_token,因为它真的很长。
我能想到的两个解决方案是:
- 复制 gapi 对象,每个对象都有一个单独的身份验证对象和令牌。将带有 id_token 的一个用于云端点,另一个用于其余的(我无法以一种使这成为可能的方式复制对象)
- 在某处记住身份验证令牌并根据我调用的 api(云端点/其他 api)替换它(这可能需要同步并且有点混乱)
我对这个问题的解决方案和可行的解决方法非常感兴趣。
如果您遇到此问题,请阅读下面的答案和我的 cmets。一旦你完成了,你就会明白这个问题实际上更多的是这个问题:How do I test Cloud Endpoints with Oauth on devserver
我会在此处留下问题,以防有人搜索其中的术语。
【问题讨论】:
-
你在使用
gapi.auth.authorize函数吗?如果是这样,您可以使用scope参数将您的令牌范围限定为多个 API。 -
是的,我确实使用
gapi.auth.authorize与 userinfo.email 和云存储的两个范围。授权函数调用回调,它执行gapi.client.oauth2.userinfo.get().execute(function(resp) { if (!resp.code) { var token = gapi.auth.getToken(); token.access_token = token.id_token; gapi.auth.setToken(token);,但是当 access_token 设置为 id_token 时,存储 api 给我 Invalid credential 错误,而 clound enpoints 工作正常。
标签: javascript google-api google-cloud-storage google-cloud-endpoints google-api-client