2014-11-12 10 views
19

Ich versuche, spring-security-oauth2.0 mit Java-basierter Konfiguration zu verwenden. Meine Konfiguration erfolgt ist, aber wenn ich Anwendung auf Tomcat bereitstellen und die /oauth/token URL für Zugriffstoken getroffen, Oauth erzeugen, um den follwoing Fehler:Spring-Security-Oauth2: Zum Zugriff auf diese Ressource ist eine vollständige Authentifizierung erforderlich.

<oauth> 
<error_description>Full authentication is required to access this resource</error_description> 
<error>unauthorized</error> 
</oauth> 

Meine Konfiguration ist auf Git hub, please click on link

Der Code ist groß, so verweisen git. Ich benutze den Chrome Postman Client für die Sendeanfrage. Folgend ist meine Bitte.

POST /dummy-project-web/oauth/token HTTP/1.1 
Host: localhost:8081 
Cache-Control: no-cache 
Content-Type: application/x-www-form-urlencoded 

grant_type=client_credentials&client_id=abc%40gmail.com&client_secret=12345678 

Der Fehler ist wie die URL von Oauth sicher ist, aber in der Konfiguration, ich gebe diese URL die alle Erlaubnis für den Zugriff. Was ist das eigentlich für ein Problem?

Antwort

14

Die client_id und client_secret, sollte standardmäßig in der Autorisierungsheader, nicht die Form-urlencoded Körper gehen.

  1. verketten Ihre client_id und client_secret, mit einem Doppelpunkt zwischen ihnen: [email protected]:12345678.
  2. Base 64 kodieren das Ergebnis: YWJjQGdtYWlsLmNvbToxMjM0NTY3OA==
  3. den Header Authorization Set: Authorization: Basic YWJjQGdtYWlsLmNvbToxMjM0NTY3OA==
+0

ich denke, dies wird mit 'grant_type = password' für' client_credentials' verwendet, dies ist nicht notwendig. Wenn ich falsch liege, korrigiere mich bitte. –

+1

Wenn ich dies versuche, wird die Ausnahme "error =" invalid_token ", error_description =" Ungültiges Zugriffstoken: [email protected] "' werfen. Ich dünn, für den Zugriff auf diese Ressource benötigt es Auth-Token, aber warum? –

+0

Nein, grant_type = password ist der Ort, an dem der Benutzer/Pass des Ressourceneigentümers (d. H. Der Endbenutzer) direkt dem Client zur Verfügung gestellt wird. client_credentials wird verwendet, wenn Sie den Ressourcenbesitzer überhaupt nicht authentifizieren; nur der Kunde selbst.Das ist es, was deine Frage anzeigt. Verwenden Sie client_credentials mit dem in meiner Antwort angegebenen Schema, wenn Sie wirklich nur den Client und nicht den Benutzer authentifizieren möchten. – GaryF

6

Der Grund dafür ist, dass der /oauth/token Endpunkt standardmäßig durch Basic Access Authentication geschützt ist.

Alles, was Sie tun müssen, ist die Authorization Header zu Ihrer Anfrage hinzufügen.

Sie können es einfach testen mit einem Tool wie curl indem Sie den folgenden Befehl eingeben:

curl.exe --user [email protected]:12345678 http://localhost:8081/dummy-project-web/oauth/token?grant_type=client_credentials

+0

Ich habe deine Antwort versucht, aber dann bekomme ich ein Popup, um den Benutzernamen und das Passwort einzugeben. Ich versuche mit meinem Login und es hilft nicht – Dejell

1

mit Frühlings-OAuth 2.0.7-RELEASE den folgenden Befehl funktioniert für mich

curl -v -u [email protected]:12345678 -d "grant_type=client_credentials" http://localhost:9999/uaa/oauth/token 

Es funktioniert auch mit Chrome POSTMAN, stellen Sie sicher, dass Sie Client und Secret auf der Registerkarte "Basic Auth", setzen Sie die Methode auf "POST" und fügen Sie den Grant-Typ auf der Registerkarte "Formulardaten" hinzu.

12

Standardmäßig verwendet Spring OAuth eine grundlegende HTTP-Authentifizierung. Wenn Sie es ausschalten mit Java-basierte Konfiguration wollen, müssen Sie Formularauthentifizierung für Kunden wie dies ermöglichen:

@Configuration 
@EnableAuthorizationServer 
protected static class OAuth2Config extends AuthorizationServerConfigurerAdapter { 
    @Override 
    public void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception { 
    oauthServer.allowFormAuthenticationForClients(); 
    } 
} 
+0

können Sie bitte helfen Sie mir auf diese Frage https://StackOverflow.com/Questions/48806722/can-i-append-Some-Information-in-Oauth-Check-Token- endpoint-and-retrieve-it-at-a –

-2

management.security.enabled=false Einstellung für mich in application.properties das Problem gelöst.

+0

Es scheint, dass dies die Sicherheit für Aktor-Endpunkte vollständig deaktiviert, was bedeutet, dass Endpunkte nicht mehr empfindlich sind, selbst wenn sie erwartet werden. – Igor

Verwandte Themen