2016-11-21 2 views
2

Я искал решение, но не могу его найти.Как получить токен SAML2 в PHP для получения маркера OAuth из WSO2 APIM

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

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

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

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

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

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


EDIT: добавление некоторых образцов. Мой утверждают 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> 

закодировать в base64-URL-кодированного XML:

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 есть кое-что отсутствует. (я искал это в Google и пришел с обменом stackoverflow, чтобы проверить идентификатор эмитента в этом утверждении, который я сделал, но я не могу идентифицировать что-то не так)

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

+0

может быть связано с http://stackoverflow.com/questions/19866021/how-to-get-saml2-bearer-assertion-profile-for-oauth-within-wso2-api-manager-to-w?rq = 1 – JRobinss

+0

может быть связано с http://stackoverflow.com/questions/34738716/wso2-saml2bearergranthandler-saml-token-issuer-verification-failed-or-issuer-not – JRobinss

ответ

1

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

  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-кодирование. Для этого я использовал код из Passing base64 encoded strings in URL (спасибо!) joeshmo

  4. в APIM/Entity Провайдеры/список/myIdS/редактировать/Федеративные аутентификаторы/SAM2 веб-SSO .../Идентичность Provider идентификатор объекта я установить значение ожидаемая конечная точка IDS, https://myids:9443/samlsso. Это решило мой первоначальный вопрос

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

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

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

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

2

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

В любом случае, поскольку вам удалось это получить, все, что вам нужно сделать сейчас, это base64-URL закодировать весь тег <Assertion>....</Assertion> и отправить его с запросом маркера OAuth2. Here is a nice online tool, если вам нужно попробовать вручную.

+0

спасибо за быстрый ответ. Я попробую с взломом, который я добавил в SSP, с утверждением, которое я получил. – JRobinss

+0

Я следил за вашим советом: вместо поиска однозначного токена я принял все утверждение в XML, закодировал его в base64-url-encode и передал его как 'assertion = ...'. Не работает, есть ли что-то, что я сделал неправильно, или у меня просто есть некоторая плохая конфигурация в APIM?(см. примеры в исходном вопросе) – JRobinss

+0

Вы получаете что-нибудь в журналах? – Bee