13 Stimmen

Wie teste ich Cloud-Endpoints mit Oauth auf dem Entwicklungsserver?

Meine App verwendet OAuthed Cloud Endpoints und funktioniert in der Produktion einwandfrei.

Mein Problem besteht darin, dass auf dem lokalen Entwicklungsserver mein Benutzer example@example.com immer eingestellt ist, obwohl ich den üblichen Authentifizierungsprozess, Zugangscode usw. durchlaufen habe und einen gültigen authentifizierten Benutzer habe.

Ich verstehe, dass example@example.com nützlich ist, um OAuth-Endpunkte zu testen, bevor ich OAuth ordnungsgemäß implementiert habe, aber da meine App funktioniert, würde ich lieber den tatsächlichen Benutzer dort sehen.

Um genau zu sein, ist meine Endpunkt-Methode

@ApiMethod(name = "insertEmp"), usw.
public Emp insertEmp(User user, Emp emp) {
      System.out.println(user.getEmail());  // (A) Protokolliere "appengine" E-Mail
      System.out.println(OAuthServiceFactory.getOAuthService().getCurrentUser().getEmail(); // (B) Protokolliere authentifizierte E-Mail

       ...

Bei der Bereitstellung funktioniert alles einwandfrei, und sowohl (A) als auch (B) protokollieren den authentifizierten Benutzer (my.email@gmail.com).

Beim Testen auf meinem lokalen Entwicklungsserver protokolliert (A) immer "example@example.com", obwohl ich den OAuth-Ablauf durchlaufen habe und einen gültigen authentifizierten Benutzer habe, und (B) protokolliert my.email@gmail.com. Um eine präzise Testung durchzuführen, benötige ich, dass der Benutzer der tatsächliche authentifizierte Benutzer ist.

Also, in einfachen Worten, wie kann ich erreichen, dass (A) und (B) identisch sind?

4voto

pinoyyid Punkte 20441

Es scheint, dass es nicht möglich ist. Ich habe es schließlich umgangen, indem ich den folgenden Code am Anfang meiner Endpunktmethoden platziert habe.

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

Jetzt stimmt selbst auf dem Entwicklungsserver die E-Mail des Benutzers mit der Oauth-E-Mail überein.

2voto

Dies ist nicht so einfach. Du musst deine Einstellungen in der APIs Console vornehmen. Hier kannst du "localhost" hinzufügen (http://localhost/). Dann kannst du dich auch über Google authentifizieren, auch wenn du deine Anwendung lokal für die Entwicklung ausführst. Ich habe es ausgiebig genutzt und es funktioniert gut. Links: https://code.google.com/apis/console/ Denke daran, dass die hier verwendeten IDs vollständig unabhängig von deiner Appengine-ID sind. Es hat mich ein paar Stunden gekostet, um das herauszufinden.

0voto

Sca09 Punkte 341

Die Sache ist, dass wenn Sie die Authentifizierung lokal durchführen, dies nicht über die Google-Server erfolgt, sodass die Authentifizierung Ihres Benutzers tatsächlich lokal nicht stattfindet.

Google stellt immer den user@example.com Benutzer zur Verfügung, wenn Sie versuchen, sich einzuloggen. Dies geschieht im Grunde genommen bei allen Diensten, z.B. wenn Sie sich über Ihr Google-Konto auf einer beliebigen Website einloggen (zum Beispiel mit GWT und App Engine).

Was kann auf Ihrer Website anders sein, wenn Sie mit Ihrem echten Benutzer testen oder den user@example.com Benutzer als Ihren Benutzer betrachten?

0voto

In Ihrem Endpunkt-API benötigen Sie dies

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

Dann haben Sie in der aufgerufenen Methode ein User-Objekt von der GAPI. Verwenden Sie dies, um die tatsächliche E-Mail aus dem google User-Objekt wie folgt zu erhalten

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

0voto

Rahul Punkte 49

Ich habe den OAuth2-Benutzer (example@example.com) durch den Benutzer aus der UserFactory ersetzt und es funktioniert gut. Ich verwende diese Methode, um Benutzer für alle API-authentifizierten API-Anfragen zu validieren.

public static User isAuthenticated(User user) throws OAuthRequestException{

    if(user == null){
        throw new OAuthRequestException("Bitte loggen Sie sich ein, bevor Sie Anfragen stellen");
    } 
    if(SystemProperty.environment.value() ==
            SystemProperty.Environment.Value.Development && "example@example.com".equalsIgnoreCase(user.getEmail()) ) {

        //Ersetzen Sie hier den Benutzer aus der Benutzerfactory.
        user = UserServiceFactory.getUserService().getCurrentUser();

    }
    return user;

}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X