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 Principal
null
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.
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
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