Jak przekazać niestandardowe informacje z narzędzia App Engine Authenticator do punktu końcowego?

Odwołuję się do niesamowitej odpowiedzi @MinWan w tym poście Google Cloud Endpoints and user 's authentication , gdzie opisuje sposób dodawania niestandardowych nagłówków do żądania przeciwko punktom końcowym App Engine w chmurze.

Staje się jasne, że możemy dodać niestandardowy nagłówek i napisać authenticator dla każdej usługi (np. Google, Twitter, Facebook), na której chcemy authenticate, gdzie każdy authenticator odczytuje konkretny nagłówek i uwierzytelnia się przeciwko usłudze. Jeśli token jest poprawna, usługa zazwyczaj zwraca odpowiedź z adresem e-mail lub identyfikatorem użytkownika oraz dodatkowymi informacjami [A], z których generujemy com.google.api.serwer.spi.auth.pospolite.Użytkownika, który jest później przekazywany do metody endpoint jako com.google.appengine.api.użytkowników.Użytkownik.

Pierwsze pytanie: dlaczego mamy dwa różne encje użytkowników, np. użytkownicy z różnymi przestrzeniami nazw? Jak się wydaje, nie są to ani sub/superclasses, więc prawdopodobnie są wyraźnie rzucane za scen.

Drugie pytanie: problem, który wiąże się z jawnie oddanym podmiotem użytkownika i że nie ma niestandardowego pola, w którym mógłbym umieścić dodatkowe informacje [a] zwrócone przez usługę, polega na tym, że dodatkowe informacje są utracone. Takie dodatkowe informacje mogą być pomocne w dopasowaniu użytkownika oauth2 usługi zewnętrznej do użytkownika lokalnego lub do użytkowników oauth2 zwracanych przez inne usługi.

Jakiś wkład? Jaki jest sugerowany sposób obsługi wielu usług uwierzytelniania?

Author: Community, 2015-02-11

2 answers

Właśnie przetestowano i możesz zdecydowanie podklasować użytkownika, aby zawierał dowolne prywatne pola. Wystarczy użyć polimorfizmu dziedziczenia klas, aby zwrócić obiekt tego typu z metody Authenticator, bez zmiany typu z domyślnego użytkownika w sygnaturze metody.

import javax.servlet.http.HttpServletRequest;
import com.google.api.server.spi.auth.common.User;
import com.google.api.server.spi.config.Authenticator;

public class BazUser extends User {
        private String secret; // extra piece of data held by this User
        public BazUser(String email) {
                super(email);
                this.secret = "notasecret";
        }
        public BazUser (String email, String secret) {
                super (email);
                this.secret = secret;
        }
}

public class BazAuthenticator implements Authenticator {
        public User authenticate(HttpServletRequest req) {
                return new BazUser ("[email protected]", "secret");
        }
}
 6
Author: Nick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-11-11 18:02:41

Funkcjonalnie wszystko działa z:

import com.google.api.server.spi.auth.common.User;

Nawet z gradle:

compile 'com.google.endpoints:endpoints-framework:2.0.0-beta.11'

Ostrzeżenie IDE można wyczyścić, włączając @SuppressWarnings("ResourceParameter") w następujący sposób:

/**
 * Adds a new PmpUser.
 *
 * @param pmpUser  pmpUser object
 */
@SuppressWarnings("ResourceParameter")
@ApiMethod(
        name = "pmpUser.post",
        path = "pmpUser",
        httpMethod = ApiMethod.HttpMethod.POST)
...
 1
Author: user7653815,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-03-25 21:40:23