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?
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");
}
}
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)
...
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