【问题标题】:Limit access to Google App Engine Endpoints限制对 Google App Engine Endpoints 的访问
【发布时间】:2015-06-08 22:04:54
【问题描述】:

我想做的是将对我的服务端点的访问限制为仅部署在 Google App Engine 上的网络应用程序,因此,只能从 some-app-id.appspot.com 和映射到它的域 mymappeddomain 进行访问.com。我也不希望用户登录以使 API 工作。因此,基本上我希望 API 只能由托管在同一 Google App Engine 应用程序实例中的 JavaScript 代码访问,而无需用户登录以使用该服务。理想情况下,我的 API 在 API Explorer 中也不可见。

我对此进行了一些研究,找到了几篇文章(sample codewalk through),但没有成功应用它们。此外,似乎所有解决方案似乎仍然需要用户登录。我已经使用我的 Google Developer Console 创建了一个 Web 应用程序客户端 ID。

端点用 Go 编写并部署到 Google App Engine。类似这样:

package my
import ( ... "github.com/GoogleCloudPlatform/go-endpoints/endpoints" ... )

func (ms *MyService) ListData(c endpoints.Context, r *MyRequest) (*MyResponse, error) {
_, err := endpoints.CurrentBearerTokenUser(c, 
    []string{ endpoints.EmailScope },
    []string{ "some-long-id-matching-what-is-used-in-javascript.apps.googleusercontent.com" })

if err != nil {
    log.Printf("auth failed")
    return nil, err
}
...

我的 JavaScript 看起来像:

var app = angular.module('myApp', ['ngRoute', 'angular-google-gapi']);

app.run(['$window', 'GAuth', 'GApi', function ($window, GAuth, GApi) {
  var CLIENT = 'some-long-id-matching-what-is-used-in-go.apps.googleusercontent.com';
  var BASE;

  if($window.location.hostname === 'localhost') {
    BASE = '//localhost:8080/_ah/api';
  } else {
    BASE = 'https://my-app-id.appspot.com/_ah/api';
  }

  GApi.load('myservice', 'v1', BASE);
  GAuth.setClient(CLIENT);
  GAuth.setScopes('https://www.googleapis.com/auth/userinfo.email');

  GAuth.checkAuth().then(function () {
    console.log('authenticated');
  }, function () {
    console.log('authentication issue');
  });
}]);

当我从浏览器运行此应用程序时,我在 JavaScript 控制台中看到以下错误:

angular-google-gapi.min.js:7 myservice v1 api loaded
https://content.googleapis.com/oauth2/v2/userinfo Failed to load resource: the server responded with a status of 401 (OK)
app.js:24 authentication issue

我很想就如何使这项工作提出建议。提前谢谢你。

【问题讨论】:

    标签: google-app-engine google-oauth google-cloud-endpoints


    【解决方案1】:

    我认为对您有用的是在每个端点处理程序中简单地设置一个“Access-Control-Allow-Origin”标头以阻止跨域请求 [1]。这是按域将某些资源锁定给 Javascript 客户端的常用习惯用法。

    [1]http://enable-cors.org/server_appengine.html

    【讨论】:

      【解决方案2】:

      GAuth.checkAuth() 它只是一种测试用户是否已经登录您的应用程序并在可能的情况下自动连接用户的方法。首次登录,您必须使用方法 GAuth.login()。参见示例:https://github.com/maximepvrt/angular-google-gapi/tree/gh-pages

      【讨论】:

      • 所以如果我打电话给GAuth.login(),会不会导致最终用户必须使用他们的谷歌账户登录?我不希望用户登录,我只想限制对我的 API 的访问来自我的域或本地主机......例如我不希望有人看到我的 JS 代码并能够从其他应用程序调用我的 API。
      • 这是不可能的,在你的谷歌开发控制台中,你已经添加了所有可以在你的 api 登录中访问的域。如果您想减少某些用户的登录,您可以检查用户电子邮件是否存在于您数据库的用户列表中。
      • “用户”是来自网络的任何匿名用户访问我的网站,但是,我需要对 API 的访问限制,因为我的 API 确实存储用户输入的数据,我不希望任意人使用 API 获取数据或构建在我的 API 之上。我在我的开发控制台中指定客户端 ID 只能从 mydomain.com 和 localhost 访问。那么我是否仍然使用 GAuth.login(),如果是,我使用什么用户凭据?我不希望用户输入任何登录凭据。
      • 我尝试添加GAuth.login(),但没有成功。此外,我看到的所有示例(最初链接)都使用 Google 帐户登录。我不想使用 Google 帐户登录,我只想让我在开发者控制台中创建的客户端 ID 能够登录。没有其他人。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-06
      • 1970-01-01
      • 2015-08-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多