2013-10-01 10 views
12

Moja aplikacja używa Outhed Cloud Endpoints i działa prawidłowo w produkcji.Jak testować punkty końcowe w chmurze za pomocą narzędzia Oauth na kreatorze

Mój problem polega na tym, że na lokalnym devserverze mój użytkownik jest zawsze ustawiony na [email protected], mimo że przeszedłem przez zwykły kod autoryzacji, kod dostępu itp. Itd. użytkownik.

Rozumiem, że ten przykład: [email protected] jest przydatny do testowania punktów końcowych oauth, zanim będę działał poprawnie, ale ponieważ moja aplikacja działa, wolałbym zobaczyć rzeczywistego użytkownika.

Mówiąc konkretnie, mój końcowy metoda jest

@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 

     ... 

Po wdrożeniu, wszystko jest w porządku, i zarówno (A) i (B) log uwierzytelnionego użytkownika ([email protected]).

Podczas testowania na moim lokalnym devserverze (A) zawsze loguję się "[email protected]", mimo że przeszedłem przez sekwencję Oauth i mam prawidłowego, uwierzytelnionego użytkownika, i (B) loguje my.email @ gmail.com. Mogę więc wykonać test hi-fi, potrzebuję, aby Użytkownik był prawdziwym uwierzytelnionym użytkownikiem.

W prostych słowach, w jaki sposób mogę uzyskać takie same wartości (A) i (B)?

Odpowiedz

3

wydaje się, że nie można zrobić. Zakończyłem kodowanie wokół niego, umieszczając następujący kod na górze moich metod Endpoint.

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

Teraz, nawet na devserver, adres e-mail użytkownika odpowiada adresowi e-mail Oauth.

+3

Nie działa dla mnie ... używając appengine 1.9.3, a wiadomość e-mail jest nadal taka sama: [email protected] –

+1

Czy nadal możesz uzyskać prawdziwy e-mail? Zyskuję null jako użytkownik i jeśli zadzwonię do OAuthServiceFactory.getOa ..(). GetCurrentUser() otrzymuję [email protected] – Patrick

+0

To samo tutaj. Dostaję [email protected] dla użytkownika zwróconego przez punkty końcowe iz OAuthServiceFactory.getOAuthService(). GetCurrentUser() – Patrick

1

To nie jest takie łatwe. Będziesz musiał dokonać ustawień w konsoli API. Tutaj będziesz mógł dodać "localhost" (http://localhost/) Następnie możesz uwierzytelnić się za pośrednictwem Google, nawet jeśli uruchamiasz aplikację na swoim lokalnym serwerze dla rozwoju. Użyłem go intensywnie i działa OK Linki: https://code.google.com/apis/console/ Pamiętaj tylko, że ID, którego używasz, jest całkowicie niezależne od twojego ID aplikacji. Zajęło mi to kilka godzin, żeby to wymyślić.

+2

Dzięki, ale to nie jest odpowiedź na moje pytanie. Mam już za sobą problem z konfigurowaniem mojego lokalnego serwera w konsoli API, a Oauth * działa *. Moje pytanie brzmi, że mimo że Oauth działa, Cloud Endpoints ignoruje je i zastępuje [email protected] jako uwierzytelniony użytkownik – pinoyyid

+1

@pinoyyid: Google mówi o tym w swojej dokumentacji "Ważne: jeśli interfejs API zaplecza jest chroniony przez Auth, twoje klient musi zapewnić obsługę techniczną zgodnie z powyższym opisem w części Dodawanie obsługi uwierzytelniania za pomocą OAuth 2.0, jednak w przypadku uruchamiania z lokalnym serwerem deweloperskim strona logowania nie jest wyświetlana w odpowiedzi na próbę zalogowania się użytkownika. Zamiast tego po prostu pojawia się wpis, przyznając dostęp użytkownika do chronionego interfejsu API, a użytkownik zwrócony jest zawsze [email protected] "pod adresem https://cloud.google.com/appengine/docs/java/endpoints/consume_android#making_authenticated_calls – maya

0

Chodzi o to, że podczas wykonywania uwierzytelniania w języku lokalnym, nie robisz tego za pośrednictwem serwerów Google, więc uwierzytelnianie użytkownika jest czymś, co w rzeczywistości nie dzieje się w lokalnym.

Google zawsze podaje użytkownika [email protected] podczas próby symulacji logowania, dzieje się to w zasadzie we wszystkich usługach, na przykład podczas logowania się za pomocą konta Google w dowolnej witrynie internetowej (na przykład przy użyciu GWT i App Engine).

Co może się różnić w Twojej witrynie, jeśli testujesz z prawdziwym użytkownikiem lub uważasz przykład użytkownika [email protected] jako swojego użytkownika?

+1

, ale ... I ** am ** przechodzenie przez serwery google. Jeśli zadzwonię do oauth punktu końcowego z mojego serwletu, otrzymuję autentycznego, uwierzytelnionego użytkownika Google. Problem polega na tym, że kod appengine/endpoint w devserver ignoruje go. Nie mogę wykonywać testów hi-fi, ponieważ chcę przetestować proces wprowadzania, w którym biorę użytkownika z nieznanego, do przechowywania poświadczeń zdolnych do uzyskiwania dostępu do interfejsów Google API. Jest to utrudnione, ponieważ zamiast rzeczywistego użytkownika moje klasy punktów końcowych CE są przedstawiane z fałszywym użytkownikiem. – pinoyyid

+0

Zaktualizowałem pytanie, aby zademonstrować rozbieżności w bardziej szczegółach. – pinoyyid

0

W swoim końcowym API trzeba to

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

Następnie w nazwie metody, trzeba będzie obiekt użytkownika z GAPI. Użyj tego, aby uzyskać rzeczywiste maila od obiektu użytkownik Google jak to

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

Proszę przeczytać pytanie. Już to mam! Problemem jest wartość zwrócona przez user.getEmail(). – pinoyyid

+0

Ponadto zakres powinien "e-mail" zgodnie z deklaracją na https://developers.google.com/+/api/oauth#profile, ponieważ userionfo.profile nie zawiera adresu e-mail użytkownika, dlatego parametr użytkownika będzie mieć wartość null. + podany zakres jest przestarzały. – Pega88

+0

co to jest "YourId"? Mam myapp-xxxx.appspot.com - Czuję, że się zbliżam, ale trochę utknąłem –

0

Wymieniłem użytkownika Oauth2 (przykład @ przykład.com) z użytkownikiem UserFactory i działa dobrze. Używam tej metody do sprawdzania poprawności użytkownika dla wszystkich żądań API uwierzytelnionych 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; 

} 
+0

To nie działa. Otrzymuję wartość null z UserServiceFactory.getUserService(). GetCurrentUser() i [email protected] z OAuthServiceFactory.getUserService() – Patrick

-1

To niemożliwe. Używam innego punktu końcowego, aby zastąpić id_użytkownika w bieżącej sesji.

0

Korzystanie odchodzenie czas pracy I uciekają się do tej funkcji, aby uzyskać użytkownika, który jest funkcjonalny zarówno na serwerze dev i produkcji:

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 
} 

ten będzie korzystał z informacji logowania do serwera dev wprowadzonej przy http://localhost:8080/_ah/login

Powiązane problemy