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