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

Мое приложение использует конечные точки Oauthed Cloud и работает нормально.

Моя проблема в том, что на локальном devserver мой пользователь User всегда настроен на example@example.com, хотя я прошел обычную авторизацию, код доступа и т. Д. И т. Д. И т. Д., И у меня есть действительный авторизованный пользователь.

Я получаю, что example@example.com полезен для проверки оконечных точек oauth до того, как у меня будет работать 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) регистрируют аутентифицированного пользователя (my.email@gmail.com).

При тестировании на моем локальном devserver, (A) всегда регистрирует "example@example.com", хотя я прошел через последовательность Oauth и имею действительного, аутентифицированного пользователя, и (B) регистрирует my.email@gmail.com. Таким образом, я могу провести тестирование высокой четкости, мне нужно, чтобы пользователь был настоящим аутентифицированным пользователем.

Итак, простыми словами, как я могу получить (A) и (B), чтобы быть одинаковыми?

7 ответов

Решение

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

if ("example@example.com".equalsIgnoreCase(user.getEmail()) {
    user = new User(OAuthServiceFactory.getOAuthService().getCurrentUser().getEmail(),"foo");
}

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

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

Используя среду выполнения go, я прибегнул к этой функции, чтобы получить пользователя, работающего как на сервере 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
}

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

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

Google всегда предоставляет пользователю example@example.com, когда вы пытаетесь смоделировать вход в систему, это происходит в основном во всех службах, например, когда вы предоставляете вход через свою учетную запись Google на любом веб-сайте (например, с помощью GWT и App Engine).).

Что может отличаться на вашем сайте, если вы проводите тестирование со своим реальным пользователем или считаете пользователя example@example.com своим пользователем?

В вашем API оконечной точки вам нужно это

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

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

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

Я заменил пользователя Oauth2 (example@example.com) на пользователя из 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 && "example@example.com".equalsIgnoreCase(user.getEmail()) ) {

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

    }
    return user;

}

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

Другие вопросы по тегам