Как проверить облачные конечные точки с помощью Oauth на devserver

Мое приложение использует Oauthed Cloud Endpoints и отлично работает в процессе производства.

Моя проблема заключается в том, что на локальном devserver мой пользователь User всегда имеет значение [email protected], хотя я прошел обычную аутентификацию, код доступа и т.д. и т.д. и т.д. и т.д. иметь действительного пользователя с автономным доступом.

Я получаю, что [email protected] полезен для проверки конечных точек oauth, прежде чем я буду работать правильно, но так как мое приложение работает, я предпочел бы видеть фактического пользователя там.

Чтобы быть конкретным, мой метод конечных точек

@ApiMethod(name = "insertEmp"), etc
public Emp insertEmp(User user, Emp emp) {
      System.out.println(user.getEmail());  // (A) log "appengine" email
      System.out.println(OAuthServiceFactory.getOAuthService().getCurrentUser().getEmail(); // (B) log authed email

       ...

При развертывании все нормально, и оба (A) и (B) регистрируют аутентифицированного пользователя ([email protected]).

При тестировании на моем локальном devserver (A) всегда регистрируется "[email protected]", хотя я прошел через последовательность Oauth и имею действительный аутентифицированный пользователь и (B) журналы [email protected] Поэтому я могу выполнить проверку hi-fidelity, мне нужно, чтобы Пользователь был настоящим аутентифицированным пользователем.

Итак, в простых терминах, как мне (A) и (B) быть одинаковыми?

Ответ 1

Кажется, это невозможно. Я закончил кодирование вокруг него, поставив следующий код в верхней части моих методов Endpoint.

if ("[email protected]".equalsIgnoreCase(user.getEmail()) {
    user = new User(OAuthServiceFactory.getOAuthService().getCurrentUser().getEmail(),"foo");
}

Итак, теперь даже на devserver адрес электронной почты пользователя соответствует электронной почте Oauth.

Ответ 2

Это не так просто. Вам нужно будет сделать свои настройки в консоли API. Здесь вы сможете добавить "localhost" (http://localhost/). Затем вы можете пройти аутентификацию через Google, даже если вы используете приложение на своем локальном хосте для разработки. Я использовал его широко, и он работает нормально Ссылки: https://code.google.com/apis/console/ Просто помните, что идентификатор, который вы используете здесь, полностью не зависит от вашего идентификатора appengine. Принял меня несколько часов, чтобы понять, что один из них.

Ответ 3

Дело в том, что когда вы выполняете аутентификацию на местном уровне, вы не делаете этого через серверы Google, поэтому аутентификация вашего пользователя - это то, чего на самом деле не происходит в локальном.

Google всегда предоставляет пользователю [email protected], когда вы пытаетесь имитировать вход в систему, это происходит в основном во всех сервисах, например, когда вы предоставляете вход в свой аккаунт Google на любом веб-сайте (например, с помощью GWT и App Engine).

Что может быть другим на вашем сайте, если вы тестируете своего реального пользователя или вы считаете пользователя [email protected] своим пользователем?

Ответ 4

В вашем API конечной точки вам понадобится

ApiMethod ( name="YourEndPointName", path="yourPath",
            clientIds={"YourId.apps.googleusercontent.com"},
                    scopes =   { "https://www.googleapis.com/auth/userinfo.profile" })

Затем в вызываемом методе у вас будет объект User из GAPI. Используйте это, чтобы получить фактическую электронную почту от объекта Google Google, как этот

public myEndPointMethod( Foo foo, User user ){
    email = user.getEmail();
}

Ответ 5

Я заменил пользователя Oauth2 ([email protected]) пользователем UserFactory, и он отлично работает. Я использую этот метод для проверки пользователя для всех API-запросов API.

public static User isAuthenticated(User user) throws OAuthRequestException{

    if(user == null){
        throw new OAuthRequestException("Please login before making requests");
    } 
    if(SystemProperty.environment.value() ==
            SystemProperty.Environment.Value.Development && "[email protected]".equalsIgnoreCase(user.getEmail()) ) {

        //Replace the user from the user factory here.
        user = UserServiceFactory.getUserService().getCurrentUser();

    }
    return user;

}

Ответ 6

Используя run runtime, я прибегнул к этой функции, чтобы получить Пользователь, который работает как на dev-сервере, так и на производстве:

func currentUser(c context.Context) *user.User {
    const scope = "https://www.googleapis.com/auth/userinfo.email"
    const devClient = "123456789.apps.googleusercontent.com"

    allowedClients := map[string]bool{
        "client-id-here.apps.googleusercontent.com": true,
        devClient: true,                // dev server
    }

    usr, err := user.CurrentOAuth(c, scope)
    if err != nil {
        log.Printf("Warning: Could not get current user: %s", err)
        return nil
    }

    if !allowedClients[usr.ClientID] {
        log.Printf("Warning: Unauthorized client connecting with the server: %s", usr.ClientID)
        return nil
    }

    if (usr.ClientID == devClient) {
        usr = user.Current(c)           // replace with a more interesting user for dev server
    }
    return usr
}

Это будет использовать введенную регистрационную информацию для сервера dev с помощью http://localhost:8080/_ah/login

Ответ 7

Это невозможно. Я использую другую конечную точку для замены user_id в текущем сеансе.