Как получить токен SAML2 в PHP для получения токена OAuth из APIM WSO2

Я искал решение, но не могу его найти.

Этот вопрос напрямую связан с:

Вот сценарий, который я хочу выполнить:

  1. пройти аутентификацию на SP с помощью SAML2. Кодируется в PHP с помощью SimpleSamlPhp.
  2. получить токен OAuth из конечной точки API mgr, используя утверждение SAML2. (используя URL Http: //api.gateway/token)
  3. вызывать API через шлюз API mgr, используя токен OAuth.

Я застрял в инструкции: получите токен подтверждения SAML2.
Где я могу найти этот токен?
В SimpleSamlPhp я могу получить атрибуты пользователя или его идентификатор, но я не могу найти никакого утверждения.

Я взломал SSP, чтобы получить последнее утверждение, но не знаю, что с ним делать. Я ожидал одно значение (например, токен), но это сложная структура. И одна из ссылок выше говорит, что я не должен получить к нему доступ!

Что я отправляю, закодированный, на URL токена?


РЕДАКТИРОВАТЬ: добавление некоторых образцов.
Мой assert XML (отредактированный):

<?xml version="1.0" encoding="UTF-8"?>
<saml2:Assertion xmlns:saml2="urn:oasis:names:tc:SAML:2.0:assertion" xmlns:saml2p="urn:oasis:names:tc:SAML:2.0:protocol" ID="okdjgbm...jdbh" IssueInstant="2016-11-28T09:49:45.808Z" Version="2.0">
<saml2:Issuer Format="urn:oasis:names:tc:SAML:2.0:nameid-format:entity">https://g...p.com:9443/samlsso</saml2:Issuer>
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
<ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />
<ds:Reference URI="#okd...kejdbh">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" />
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
<ds:DigestValue>RrGcR...cktFuH0=</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>b91j/k...Z7d4=</ds:SignatureValue>
<ds:KeyInfo>
<ds:X509Data>
<ds:X509Certificate>MIICNT...Wq8uHSCo=</ds:X509Certificate>
</ds:X509Data>
</ds:KeyInfo>
</ds:Signature>
<saml2:Subject>
<saml2:NameID Format="urn:oasis:names:tc:SAML:1.1:nameid-format:emailAddress">[email protected]</saml2:NameID>
<saml2:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">
<saml2:SubjectConfirmationData InResponseTo="_80258326a1...cd4bbd" NotOnOrAfter="2016-11-28T09:54:45.807Z" Recipient="http://1.2.3.4/simplesamlphp/www/module.php/saml/sp/saml2-acs.php/wso2-sp" />
</saml2:SubjectConfirmation>
<saml2:SubjectConfirmation Method="urn:oasis:names:tc:SAML:2.0:cm:bearer">
<saml2:SubjectConfirmationData InResponseTo="_8025832...d4bbd" NotOnOrAfter="2016-11-28T09:54:45.807Z" Recipient="https://my.wso2.apim:8243/token" />
</saml2:SubjectConfirmation>
</saml2:Subject>
<saml2:Conditions NotBefore="2016-11-28T09:49:45.808Z" NotOnOrAfter="2016-11-28T09:54:45.807Z">
<saml2:AudienceRestriction>
<saml2:Audience>mytestapp</saml2:Audience>
<saml2:Audience>https://my.wso2.apim:8243/token</saml2:Audience>
</saml2:AudienceRestriction>
</saml2:Conditions>
<saml2:AuthnStatement AuthnInstant="2016-11-28T09:49:45.815Z" SessionIndex="1f5192...b591">
<saml2:AuthnContext>
<saml2:AuthnContextClassRef>urn:oasis:names:tc:SAML:2.0:ac:classes:Password</saml2:AuthnContextClassRef>
</saml2:AuthnContext>
</saml2:AuthnStatement>
<saml2:AttributeStatement />
</saml2:Assertion>

закодировать как XML-код в формате base64:

PHNhbWwyO...dGlvbj4,

используя метод, скопированный из другого поста SO

function base64_url_encode($input) {
return strtr(base64_encode($input), '+/=', '-_,');
}

Это около 20 строк (и да, в конце есть запятая).

Это не работает, я получаю результат JSON

{"error":"invalid_grant","error_description":"Provided Authorization Grant is invalid."}

По следам:

TID: [0] [AM] [2016-11-29 11:04:50,297] DEBUG {org.wso2.carbon.identity.oauth2.token.handlers.grant.saml.SAML2BearerGrantHandler} -  SAML Token Issuer verification failed or Issuer not registered {org.wso2.carbon.identity.oauth2.token.handlers.grant.saml.SAML2BearerGrantHandler}
TID: [0] [AM] [2016-11-29 11:04:50,298] DEBUG {org.wso2.carbon.identity.oauth2.token.AccessTokenIssuer} -  Invalid Grant provided by the client, id=fkJa...Ohoa, user-name=null to application=myapp-subscriber_test_PRODUCTION {org.wso2.carbon.identity.oauth2.token.AccessTokenIssuer}
TID: [0] [AM] [2016-11-29 11:04:50,300] DEBUG {org.wso2.carbon.identity.oauth2.token.AccessTokenIssuer} -  OAuth-Error-Code=invalid_grant client-id=fkJa...hoa grant-type=urn:ietf:params:oauth:grant-type:saml2-bearer scope=PRODUCTION {org.wso2.carbon.identity.oauth2.token.AccessTokenIssuer}

Я спрашиваю вокруг к конфигураторам системы. Мне кажется, что-то не хватает в связи между IDS, APIM и OAuth, какое-то объявление.
(Я гуглил это и придумал обмен стековым потоком, чтобы проверить идентификатор эмитента в утверждении, что я и сделал, но я не могу определить, что там не так)

Спасибо за помощь, я вернусь, если у меня будет что-нибудь новое. За исключением, конечно, если я упустил что-то очевидное!

2

Решение

Когда вы входите в систему с помощью SAML SSO, вы получаете ответ SAML с Assertion в этом. Вы можете увидеть пример ответа / утверждения Вот. Это утверждение необходимо для получения токена OAuth2. Тем не менее, похоже, что ваш php-фреймворк не предоставляет вам ответ SAML напрямую. Это очень плохо, потому что тебе это нужно здесь.

В любом случае, поскольку вам удалось получить это, все, что вам нужно сделать сейчас, это base64-URL закодировать весь <Assertion>....</Assertion> отметьте и отправьте с запросом токена OAuth2. Вот хороший онлайн инструмент если вам нужно попробовать вручную.

2

Другие решения

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

  1. Я взломал simpleSamlPhp потому что они не обеспечивают утверждение SAML2 (см. https://github.com/simplesamlphp/simplesamlphp/issues/220). Я не сделал это хорошим способом, потому что я только хотел заставить это работать. Это некрасиво, но это работает. Вот мой хак, я поместил его в строку 125 файла saml2-acs.php:

    // ADDED to get SAML2 assertion in SP
    if (array_key_exists('SAMLResponse', $_POST)) {
    $attributes["samlresp"] = $_POST['SAMLResponse'];
    }
    
  2. В моем приложении PHP я затем использую этот код:

    $authdata_array= $as->getAuthDataArray();
    $postSaml2Assert = $authdata_array["Attributes"]["samlresp"];
    $msg = base64_decode($postSaml2Assert);
    $document = new DOMDocument();
    $document->loadXML($msg);
    $assertion = $document->getElementsByTagNameNS ("urn:oasis:names:tc:SAML:2.0:assertion", "Assertion")->item(0);
    $saml2AssertionXml = $document->saveXML($assertion);
    
  3. Я кодирую утверждение base64 и кодирую URL. Для этого я использовал код из Передача строк в кодировке base64 в URL (Спасибо joeshmo!)

  4. в APIM / Провайдеры сущностей / список / myIdS / edit / Федеративные аутентификаторы / SAM2 web SSO … / Идентификатор сущности провайдера идентификации Я установил значение ожидаемой конечной точки IDS, https: // myids: 9443 / samlsso.
    Это решило мою первоначальную проблему

  5. в конфигурации SP (в IDS) я добавил токен oauth как для аудитории, так и для получателя, выглядит так https: // myAPIM: 9443 / oauth2 / маркер /. Осторожно, как аудитория а также получатель!

  6. Поскольку я отлаживал, я отформатировал утверждение XML, поэтому оно не работало, поэтому я столкнулся с проблемой, подробно изложенной здесь. WSO2 Identity Server OAuth2 Beamr Утверждение SAML поэтому я просто удалил форматирование и использовал строку XML как есть. (Я конечно убрал эту ошибку сверху)

  7. У меня была последняя ошибка, которую легко решить: NotOnOrAfter Флаг создавал проблемы, потому что была задержка между получением утверждения SAML2 и использованием его для генерации токена. Извлеченный урок: утверждение SAML2 следует создавать сразу после входа в систему, а не перед вызовом API.

Надеюсь, что это помогает другим. Спасибо @Bhathiya за помощь!

1

По вопросам рекламы [email protected]