2013-01-03 14 views
15

Ich versuche, einen Clientanmeldeinformationenfluss zwischen unserem neuen REST-Server und unserer vorhandenen Clientanwendung zu verstehen und zu implementieren. Ich habe Spring-Sicherheit OAuth2 wie this eingerichtet. Von meinem Verständnis so weit sollte mein Server unterstützt jetzt die folgende Anfrage:Grundlegendes zum OAuth2-Clientanmeldungsdatenfluss

$ curl -X -v -d 'client_id=the_client&client_secret=secret&grant_type=client_credentials' -X POST "http://localhost:9090/oauth/token" 

aber ich bekomme

InsufficientAuthenticationException: There is no client authentication 

verursacht durch die Principalnull hier (federSicherheitsCode) zu sein:

@FrameworkEndpoint 
@RequestMapping(value = "/oauth/token") 
public class TokenEndpoint extends AbstractEndpoint { 

    @RequestMapping 
    public ResponseEntity<OAuth2AccessToken> getAccessToken(Principal principal, 
      @RequestParam("grant_type") String grantType, @RequestParam Map<String, String> parameters) { 

     if (!(principal instanceof Authentication)) { 
      throw new InsufficientAuthenticationException(

So scheint es, ich brauche Authentifizierung gegen den Server zuerst. Aber das ist nicht was ich tun möchte. Ich möchte, dass zwei meiner Server mit einem gemeinsamen Geheimnis miteinander kommunizieren. Der OAuth-Anbieterserver sollte dem (vertrauenswürdigen) Clientserver auf Anforderung ein Zugriffstoken bereitstellen, damit der Clientserver dieses Token für den Zugriff auf alle REST-Ressourcen auf dem Server verwenden kann. Dies sollte die REST-Ressourcen vor externem Zugriff schützen.

Später möchte ich ausgewählte Ressourcen an Dritte weitergeben und eventuell auch feinere Sicherheit für die Server-zu-Server-Kommunikation implementieren. Aber jetzt muss ich den REST-Server vor externem Zugriff schützen.

Sieht aus, als ob ich einige Missverständnisse über den gesamten Client-Berechtigungsfluss oder die Anwendung von Federsicherheitsrechten haben könnte, also wäre jede Klärung sehr willkommen.

Antwort

18

Sie authentifizieren Ihren Client nicht beim Autorisierungsserver.

Sie brauchen so etwas wie dies zu tun:

curl --user the_client:secret --data "grant_type=client_credentials" http://localhost:9090/oauth/token 

Dies wird den Client mit dem Autorisierungsserver authentifizieren und dann grant_type und andere Parameter angeben. Dadurch wird ein Zugriffstoken vom Typ "Bearer" zurückgegeben, dessen Gültigkeitsbereich durch die oauth-Clientdetails bestimmt wird. Sobald Sie das Token haben, können Sie auf Ihre geschützten Ressourcen zugreifen, indem Sie die Autorisierungskopfzeile setzen:

+0

Vielen Dank für Ihre Antwort. Also ist mein Gedankengang grundsätzlich richtig? Für den Client-Credentials-Flow fordere ich ein Token mit den Client-Credentials und dem Grant-Typ an und verwende dann dieses Token, um auf die geschützten Ressourcen zuzugreifen? Ich denke, ich habe gerade einen Setup-Fehler, weil das Verwenden des sparklr Beispielprojekts der Anruf, den ich oben erwähnte, funktioniert .. – Pete

+0

Ich denke, dass Sie auf dem richtigen Weg sind. Der Client fordert zuerst einen Token mit einem bestimmten Berechtigungstyp an. Dann übergeben Sie einfach das Token im Auth-Header, wenn Sie auf die geschützte Ressource zugreifen. Ich habe meine Antwort mit einem Beispiel für den Zugriff auf die Ressource aktualisiert. – kldavis4