2016-01-29 36 views
6

Używam Postmana do testowania OAuth 2 z waniliowej instalacji AEM.403 Odpowiedź od Adobe Experience Manager OAuth 2 Token Endpoint

enter image description here

Postman można z powodzeniem uzyskać kod autoryzacji z/OAuth/autoryzować po I przyznać dostęp:

enter image description here

Ale kiedy próbuje użyć kodu, aby otrzymać token z/OAuth/token otrzymuje następującą odpowiedź:

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

Patrząc w skrzypka robi POST do/OAuth/tokena z następującymi Nazwa/wartości w organizmie:

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

jestem brakuje czegoś?

Odpowiedz

1

Znalazłem odpowiedź siebie i Pomyślałem, że podzielę się tym, przez co przeszedłem, oraz odpowiedzią, ponieważ może pomóc innym nowym osobom w AEM.

Jak znaleźć przyczynę błędu:

  1. Idź do CRXDE Lite.
  2. Wybierz konsolę.
  3. Następnie odznacz przycisk zatrzymania, aby pojawiły się nowe logi konsoli (jest to dla mnie bardzo sprzeczne z intuicją).

CRXDE Lite Console

Stamtąd udało mi się zobaczyć przyczynę problemu:

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

Bo listonosz nie umieszczenia odnośnika zwrotnego w nagłówku żądania musiałem powiedzieć Apache Sling, aby umożliwić puste nagłówki żądań.

Aby to zrobić:

  1. Przejdź do/system/konsola/ConfigMgr
  2. Otwórz Apache Sling Polecający Filter Config
  3. Wybierz Zezwalaj pudełko pusty Sprawdź

Apache Sling Referrer Filter Config

1

Pomogłaby, gdyby można było podać niektóre fragmenty kodu dotyczące budowania adresu URL i pobierania tokena.

Oto przykład tego, jak wdrożyliśmy rozwiązanie bardzo podobne do tego, co próbujesz zrobić, może to pomoże.

Definiowanie usługi takie jak poniżej (fragment) i określenie wartości (host, adres URL, itp) w OSGi (lub można również ciężko Kod je w celach testowych)

 @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

Dzięki za odpowiedź. Używam funkcji Oauth w aplikacji Postman do budowania adresów URL i pobierania tokena, który można pobrać bezpłatnie [tutaj] (https://chrome.google.com/webstore/detail/postman/fhbjgbiflinjbdggehcddcbncdddomop?hl=en). Jeśli weźmiesz instalację wanilii AEM 6.1 i dodasz nowego klienta Oauth, a następnie użyjesz danych klienta w Postman, to odtworzysz mój scenariusz. Jestem z domeny .NET, więc próbowałem budować klienta .NET, ale też zwróciłem 403, gdy próbuję wysłać do/oauth/token. – GerardBeckerleg

+0

Mogłem źle zrozumieć. Czy możesz spróbować adresu URL w Publish (4503), sprawdź, czy to ma znaczenie. –

+0

Ten sam problem podczas pracy w środowisku publikowania (4503). – GerardBeckerleg

0

Dobry sposób na umożliwienie listy dozwolonych hostów, w przeciwnym razie jest to sprzeczne z b est praktyki dla listy kontrolnej bezpieczeństwa AEM.

To jest dobre dla środowiska programistycznego, a nie dla produkcji.