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?

0voto

user1796637 Punkte 41

Mit dem Go-Laufzeitmodul habe ich zu dieser Funktion gegriffen, um einen Benutzer zu erhalten, der sowohl auf dem Entwicklungsserver als auch in der Produktion funktioniert:

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,                // Entwicklungsserver
    }

    usr, err := user.CurrentOAuth(c, scope)
    if err != nil {
        log.Printf("Warnung: Aktuellen Benutzer konnte nicht abgerufen werden: %s", err)
        return nil
    }

    if !allowedClients[usr.ClientID] {
        log.Printf("Warnung: Nicht autorisierter Client verbindet sich mit dem Server: %s", usr.ClientID)
        return nil
    }

    if (usr.ClientID == devClient) {
        usr = user.Current(c)           // mit einem interessanteren Benutzer für den Entwicklungsserver ersetzen
    }
    return usr
}

Dies wird die Anmeldeinformationen des Entwicklungsservers verwenden, die unter http://localhost:8080/_ah/login eingegeben wurden.

-1voto

gambettoturco Punkte 47

Es ist nicht möglich. Ich verwende einen anderen Endpunkt, um die Benutzerkennung in der aktuellen Sitzung zu ersetzen.

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