0

То, что я хотел бы сделать, - ограничить доступ к моим конечным точкам обслуживания только для веб-приложения, развернутого в Google App Engine, поэтому доступ возможен только из some-app-id.appspot.com и домен, сопоставленный с ним, mymappeddomain.com. Я также не хочу, чтобы пользователь входил в систему, чтобы API-интерфейсы работали. Поэтому, в основном, я хочу, чтобы API был доступен только для кода JavaScript, размещенного в том же приложении приложения Google App Engine, без входа в систему для использования этой службы. В идеале мой API не доступен для просмотра в API-интерфейсе API.Ограничить доступ к конечным точкам Google App Engine

Я изучил это немного и нашел несколько статей (sample code, walk through), но не успел их применить. Кроме того, похоже, что все решения по-прежнему требуют от пользователя входа в систему. Я создал идентификатор клиента веб-приложения, используя консоль Google Developer.

Конечная точка написана на 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 

Мне бы понравились предложения о том, как сделать эту работу. Заранее спасибо.

ответ

0

GAuth.checkAuth() это просто метод проверки, если пользователь уже выполнил вход в ваше приложение и автоматически подключил пользователя, если это возможно. Чтобы войти в систему в первый раз, вы должны использовать метод GAuth.login(). См. Пример: https://github.com/maximepvrt/angular-google-gapi/tree/gh-pages

+0

Так что, если я называю 'GAuth.login()', это будет причиной конечного использования, чтобы иметь для входа в систему с помощью аккаунта Google? Я не хочу, чтобы пользователи входили в систему, я просто хочу ограничить доступ к моему API для моего домена или локального хоста ... например. Я не хочу, чтобы кто-то смотрел мой JS-код и мог вызвать мой API из другого приложения. – SimplicityGuy

+0

Невозможно, чтобы в консоли google dev вы добавили все домены, которые могут получить доступ к вашему логину api. Если вы хотите уменьшить логин для некоторого пользователя, вы можете проверить, существует ли электронная почта пользователя в вашем списке пользователей в вашем db. –

+0

«Пользователь» - это любой анонимный пользователь из сети, попавшей на мой сайт, однако мне нужно ограничение доступа к API, так как мой API хранит данные, которые вводит пользователь, и я не хочу, чтобы произвольные люди, использующие API, получали данные или строить поверх моего API. Я указал в моей консоли dev, что идентификатор клиента доступен только из mydomain.com и localhost. Так я все еще использую GAuth.login(), и если да, то какие учетные данные пользователя я использую? Я не хочу, чтобы пользователи вводили какие-либо учетные данные. – SimplicityGuy

0

Я думаю, что для вас может быть просто задан заголовок «Access-Control-Allow-Origin» в каждом из ваших обработчиков конечных точек для блокировки запросов на перекрестный поиск [1]. Это нормальная идиома для блокировки некоторого ресурса для клиентов Javascript по домену.

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

Смежные вопросы