2016-01-29 15 views
6

Ich verwende Postman, um OAuth 2 von einer VAN-AEM-Installation zu testen.403 Antwort von Adobe Experience Manager OAuth 2-Token-Endpunkt

enter image description here

Postman kann den Autorisierungscode erfolgreich erhalten aus/oauth/genehmigen, nachdem ich Zugang gewähren:

enter image description here

Aber wenn es versucht, den Code zu verwenden, um ein Token von/oauth zu erhalten/Token erhält es die folgende Antwort:

HTTP ERROR: 403 Problem accessing /oauth/token. Reason: Forbidden Powered by Jetty://

In Fiddler suchen geht es ein POST/oauth/Token mit den folgenden Namen/Werten im Körper:

client_id: Client ID from /libs/granite/oauth/content/client.html

client_secret: Client Secret from /libs/granite/oauth/content/client.html

redirect_uri: https://www.getpostman.com/oauth2/callback

grant_type: authorization_code

code: Code returned from previous request to oauth/authorize

ich etwas fehle?

Antwort

1

fand ich die Antwort selbst und Ich dachte, ich würde den Prozess, den ich durchmachte, genauso teilen wie die Antwort, weil es anderen Leuten helfen könnte, die neu bei AEM sind.

Wie die Ursache des Fehlers zu finden:

  1. Zum CRXDE Lite.
  2. Konsole auswählen.
  3. Deaktivieren Sie dann die Stopp-Schaltfläche, damit neue Konsolenprotokolle angezeigt werden (dies ist für mich sehr kontraproduktiv).

CRXDE Lite Console

Von hier aus konnte ich die Ursache des Problems sehen:

org.apache.sling.security.impl.ReferrerFilter Rejected empty referrer header for POST request to /oauth/token

Da Postbote ich Apache Sling keine Referrer im Request-Header setzen musste sagen ermöglichen leere Anforderungsheader

dies tun:

  1. Zum/system/console/ConfigMgr
  2. Öffnen Sie den Apache Sling Referrer-Config Filter
  3. die leeren Kästchen

Apache Sling Referrer Filter Config

Wählen Sie Zulassen
1

Würde helfen, wenn Sie einige Code-Schnipsel auflisten können, wie Sie die URL erstellen und das Token abrufen.

Hier ist ein Beispiel, wie wir das, was Sie versuchen, sehr ähnlich machen, vielleicht wird es helfen.

Definieren Sie einen Dienst wie unten (Snippet) und definieren die Werte (Host, URL, etc.) in OSGi (oder Sie können auch sie hart Code für Testzwecke)

 @Service(value = OauthAuthentication.class) 
    @Component(immediate = true, label = "My Oauth Authentication", description = "My Oauth Authentication", policy = ConfigurationPolicy.REQUIRE, metatype = true) 
    @Properties({ 
     @Property(name = Constants.SERVICE_VENDOR, value = "ABC"), 
     @Property(name = "service.oauth.host", value = "", label = "Oauth Host", description = "Oauth Athentication Server"), 
     @Property(name = "service.oauth.url", value = "/service/oauth/token", label = "Oauth URL", description = "Oauth Authentication URL relative to the host"), 
     @Property(name = "service.oauth.clientid", value = "", label = "Oauth Client ID", description = "Oauth client ID to use in the authentication procedure"), 
     @Property(name = "service.oauth.clientsecret", value = "", label = "Oauth Client Secret", description = "Oauth client secret to use in the authentication procedure"), 
     @Property(name = "service.oauth.granttype", value = "", label = "Oauth Grant Type", description = "Oauth grant type") }) 
     public class OauthAuthentication { 
     ... 
     @Activate 
     private void activate(ComponentContext context) { 
     Dictionary<String, Object> properties = context.getProperties(); 
     host = OsgiUtil.toString(properties, PROPERTY_SERVICE_OAUTH_HOST,new String()); 

     // Similarly get all values 
     url = 
     clientID = 
     clientSecret = 
     grantType = 
     authType = "Basic" + " "+ Base64.encode(new String(clientID + ":" + clientSecret)); 
     } 

     public static void getAuthorizationToken(
     try { 
      UserManager userManager = resourceResolver.adaptTo(UserManager.class); 
      Session session = resourceResolver.adaptTo(Session.class); 

      // Getting the current user       
      Authorizable auth = userManager.getAuthorizable(session.getUserID()); 

     user = auth.getID(); 
     password = ... 
     ... 
     ... 
     String serviceURL = (host.startsWith("http") ? "": protocol + "://") + host + url; 
     httpclient = HttpClients.custom().build(); 
     HttpPost httppost = new HttpPost(serviceURL); 

     // set params 
     ArrayList<BasicNameValuePair> formparams = new ArrayList<BasicNameValuePair>(); 
     formparams.add(new BasicNameValuePair("username", user)); 
     formparams.add(new BasicNameValuePair("password", password)); 
     formparams.add(new BasicNameValuePair("client_id", clientID)); 
     formparams.add(new BasicNameValuePair("client_secret",clientSecret)); 
     formparams.add(new BasicNameValuePair("grant_type",grantType)); 

      UrlEncodedFormEntity postEntity = new UrlEncodedFormEntity(formparams, "UTF-8"); 
      httppost.setEntity(postEntity); 

      // set header 
      httppost.addHeader("Authorization", authType); 
      response = httpclient.execute(httppost); 
      HttpEntity entity = response.getEntity(); 

      if (response.getStatusLine().getStatusCode() == 200) { 
      if (entity != null) { 
       object = new JSONObject(EntityUtils.toString(entity)); 
      } 
      if (object != null) { 
       accessToken = object.getString("access_token"); 
       //// 
      } 
      } 
     } 
+0

Danke für die Antwort. Ich verwende die Oauth-Funktionalität in Postman, um die URLs zu erstellen und das Token herunterzuladen, das Sie kostenlos von [hier] herunterladen können (https://chrome.google.com/webstore/detail/postman/fhbjgbifljjbdggehcddcbncdddomop?hl=de). Wenn Sie eine Vanilla-Installation von AEM 6.1 ausführen und einen neuen Oauth-Client hinzufügen und dann die Clientdetails in Postman verwenden, haben Sie mein Szenario neu erstellt. Ich bin von einem .NET-Hintergrund so versucht, einen .NET-Client zu erstellen, aber das hat auch einen 403 zurückgegeben, wenn Sie versuchen, nach/oauth/token zu posten. – GerardBeckerleg

+0

Ich habe vielleicht missverstanden. Können Sie die URLs in der Publish (4503) Umgebung testen, sehen Sie, ob es einen Unterschied macht. –

+0

Das gleiche Problem bei der Ausführung in der Umgebung Publish (4503). – GerardBeckerleg

0

Gute Möglichkeit, dies zu erlauben, die erlaubten Hosts aufzulisten, sonst ist dies gegen b est Praktiken für AEM Sicherheitscheckliste.

Es ist gut für Entwicklungsumgebung nicht für die Produktion.

Verwandte Themen