Как проверить облачные конечные точки с 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 в текущем сеансе.