403 Ответ от Adobe Experience Manager OAuth 2 Конечная точка токена

Я использую Postman для тестирования OAuth 2 из ванильной установки AEM.

введите описание изображения здесь

Почтальон может успешно получить код авторизации из / oauth / authorize после того, как я предоставлю доступ:

введите описание изображения здесь

Но когда он пытается использовать код для получения токена из / oauth / token, он получает следующий ответ:

ОШИБКА HTTP: 403 Ошибка доступа к /oauth/token. Причина: Запрет Приведено в действие Причалом: //

Глядя в Fiddler, он создает токен POST для / oauth / со следующим именем / значениями в теле:

client_id: идентификатор клиента из /libs/granite/oauth/content/client.html

client_secret: секрет клиента из /libs/granite/oauth/content/client.html

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

тип_правки: код авторизации

code: Код, возвращенный из предыдущего запроса к oauth / authorize

Я что-то пропустил?

3 ответа

Решение

Я сам нашел ответ и подумал, что поделюсь процессом, через который прошел, и ответом, потому что он может помочь другим людям, плохо знакомым с AEM.

Как найти причину ошибки:

  1. Перейти к CRXDE Lite.
  2. Выберите консоль.
  3. Затем отмените выбор кнопки "Стоп", чтобы разрешить появление новых журналов консоли (это очень нелогично для меня).

CRXDE Lite Console

Отсюда я смог увидеть причину проблемы:

org.apache.sling.security.impl.ReferrerFilter Отклонил пустой заголовок реферера для запроса POST в /oauth/token

Поскольку почтальон не помещает реферер в заголовок запроса, я должен был сказать Apache Sling, чтобы разрешить пустые заголовки запроса.

Сделать это:

  1. Перейдите в /system/console/configMgr
  2. Откройте настройку фильтра ссылок Apache Sling.
  3. Установите флажок Разрешить пустое

Apache Sling Referrer Filter Config

Помогло бы, если вы можете перечислить некоторые фрагменты кода о том, как вы строите URL и выбираете токен.

Вот пример того, как мы реализовали, очень похоже на то, что вы пытаетесь сделать, возможно, это поможет.

Определите службу, как показано ниже (фрагмент), и определите значения (host, url и т. Д.) В OSGI (или вы также можете жестко их кодировать в целях тестирования)

     @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");
              ////
            }
          }
      }

Хороший способ разрешить это перечислять разрешенные хосты, в противном случае это противоречит рекомендациям по проверке безопасности AEM.

Это хорошо для среды разработки, а не для производства.

Другие вопросы по тегам