IBM API Connect - Невозможно передать значимое сообщение из ответа URL-адреса аутентификации клиенту oAuth / token - PullRequest
1 голос
/ 09 января 2020

У меня есть провайдер oAuth, который использует URL аутентификации. В некоторых случаях мой URL-адрес аутентификации возвращает «не-200» со значениями сообщений, например, неверное имя пользователя, неверный пароль, пользователь заблокирован и т. Д. c. Интересно, как передать значимое сообщение с URL-адреса аутентификации клиенту, который запрашивает токен через API (oauth2 / token) ?? Я пробовал много способов, API Connect всегда выдает 401 - только недопустимое разрешение.

Вот мой код провайдера oAuth

x-ibm-configuration:
  testable: true
  enforced: true
  phase: realized
  oauth2:
    client-type: confidential
    scopes:
      weather: Weather Information
      openid: Enable OIDC
    grants:
      - password
    identity-extraction:
      type: basic
    authentication:
      x-ibm-authentication-url:
        url: 'https://8hxovobj7g.execute-api.eu-west-2.amazonaws.com/Prod/auth'
    authorization:
      type: authenticated
    access-token:
      ttl: 1500
    refresh-token:
      count: 2048
      ttl: 2682000
  gateway: datapower-gateway
  assembly:
    execute:
...
...

, когда аутентификация завершается неудачно из-за неверного имени пользователя, URL-адрес аутентификации возвращается

401 Unauthorized
{
    "error": "incorrect username"
}

Однако, когда я использую почтальон для отправки запроса в API Connect Gatwatway к провайдеру oAuth (путь: / oauth2 / token)

, если правильный пароль пользователя (authen Реестр пользователей URL возвращает 200-ОК, я получу

{
    "token_type": "bearer",
    "access_token": "AAIkNTU4M2RlMzktODY1NS00ZDQ1LTgyMjctODEyMDM4MDUzMTE2m7lBYXfx73OVPONAHoLT5VNdtSVD40Hu-M3nAQPu6wdviOxcIfbsOXBwt-Iy8EAgLzuATlZB7RBME_U5Ymd5fDkRTwy05G9zGmV7mIkawaELtiOj4xdzQr7Vn-indlv-y1NFEjvRv2VrK0d3TOqZnTEj5heDdY7Q0X9BFeydV4MtS-gCpnj-9l6TU3XqyeiK5hGnBZkZRAWOIskLm4KCyf8n_mnsi42vN9GLxlxoO9EmuHAwXOxr_aocKaaVlLKK5vDMHBRws2Vguqk3eVuoh9EnkRZvjbTurmW57bCgX3nMTd6MwcEYFkAGh-cOcEDyydZR6BI_pLuwaUM9RN8Vnb7EATQjzW2d_eHKQyjShcyM0TqxzhYq3q90fLfJLo08WxDgTFaKpGHA6qoZmUpYRLeyyImhOPtyd9p1l9z87g52duHbL1cyVGErHktTVpeXsmIRtn-QTTvI4jWmjxPZnSYj_rEeR9S8QAxYpHSEPmJQQmsjISf2SIRLABwuhG9dKyrrzs3UTotVyIotxmJjc9lfEsEtDTz9Ej--yQFw97ESHCVEvOkifeyIJ9F5MyPFh7fMEoGGwyDmWEfZSYRpkLg4_ib3dbjkGAuthiwjdA0",
    "metadata":
...
}

, если неверное имя пользователя / пароль (authen URL реестра пользователей возвращает 401-Несанкционированный с телом ответа (сообщение об ошибке), я получу

401-Unauthorized 
{
    "error": "invalid_grant"
}

URL-адрес аутентификации изготовлен на заказ. Я попытался сделать разные возвраты в URL-адресе аутентификации (другой код ответа http / body / headers), которые не могут повлиять на результат oauth / toauth конечного пользователя, который всегда вернуть сообщение «недопустимый грант». что я действительно хочу передать конечному пользователю сообщение с результатом аутентификации URL, чтобы пользователи знали, что не так например, неверное имя пользователя

Спасибо за любезную помощь

1 Ответ

0 голосов
/ 27 марта 2020

К сожалению, похоже, что в API C v5 невозможно отрегулировать ошибку OAuth на основе ответа от вызова URL-адреса аутентификации.

Вы можете проверить код DataPower XSLT, который обрабатывает этот случай (local: /isp/aaa-ldap-lib.xsl), чтобы увидеть больше деталей. Для любого кода ответа не-200, возвращаемого URL-адресом аутентификации, выдается та же жестко закодированная ошибка. Проверяется только код ответа, и вся информация ответа отбрасывается после этой проверки, включая код ответа.

В случае кода ответа не-200, возвращаемого URL-адресом для аутентификации, выполняется следующий код XSLT:

<xsl:call-template name="error">
  <xsl:with-param name="code" select="'401'"/>
  <xsl:with-param name="reason" select="'Unauthorized'"/>
  <xsl:with-param name="challenge" select="'Basic'" />
</xsl:call-template>

Это означает, что невозможно различить guish между ошибками, вызванными различными ответами URL-адреса аутентификации в перехвате сборки OAuth API. Вы можете перехватить UnauthorizedError в созданной сборке в API-интерфейсе OAuth, но у вас не будет дополнительной информации, на основе которой вы сможете создать собственный ответ об ошибке.

Однако, если вы используете локальный API C v5 и вы иметь доступ к шлюзу DataPower, который вы можете:

  • изменить упомянутый xsl-файл для распространения кода состояния / причины из URL-адреса аутентификации (возможно, с использованием расширений шлюза)
  • информация необходима, добавить пользовательскую сборку к вашему OAuth API, где вы должны перехватить UnauthorizedError и добавить код GatewayScript для настройки поведения

Код GatewayScript для настройки поведения в случае перехвата UnauthorizedError будет выглядеть примерно так:

let p = session.name('policy');
let e = p.getVariable('fw/exception');
let statusCode = e.httpCode;
let statusReason = e.httpReasonPhrase;
...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...