限制对Google App Engine端点的访问权限

时间:2015-04-03 19:34:54

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

我想要做的是将对我的服务端点的访问权限仅限于部署在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

我喜欢有关如何完成这项工作的建议。提前谢谢。

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我认为可能对你有用的只是简单地设置一个“访问控制 - 允许 - 来源”'每个端点处理程序中的标头用于阻止跨源请求[1]。这是通过域将某些资源锁定到Javascript客户端的常规习惯用法。

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