Протокол обмена маркеров
Если клиентское приложение получило маркер от стороннего ЦИ, то оно может обменять этот маркер на маркер от ЦИ DSS.
Эта процедура описана в OAuth20TE.
Для обмена маркерами клиент должен сформировать следующий запрос.
POST /STS/oauth/token HTTP/1.1
Host: hostname
Content-Type: application/x-www-form-urlencoded
cache-control: no-cache
grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Atoken-exchange
&client_id=12cf4adb-ba3e-40d0-a5d9-fa507ef26932
&resource=urn%3Acryptopro%3Adss%3Asignserver%3ASignServer
&subject_token=eyJ0
&subject_token_type=urn%3Aietf%3Aparams%3Aoauth%3Atoken-type%3Ajwt
В параметре grant_type
передаётся значение
urn:ietf:params:oauth:grant-type:token-exchange
, в параметре
subject_token_type
указывается тип исходного маркера, в параметре
subject_token
передаётся маркер доступа от стороннего ЦИ.
Остальные параметры являются стандартными для протокола OAuth:
resource
содержит идентификатор Сервиса Подписи, для
которого необходимо выпустить результирующий маркер доступа, client_id -
идентификатор зарегистрированного OAuth-клиента.
Допустимые значения subject_token_type
:
urn:ietf:params:oauth:token-type:jwt
,urn:ietf:params:oauth:token-type:saml1
,rn:ietf:params:oauth:token-type:saml2
.
В случае urn:ietf:params:oauth:token-type:saml1
или
urn:ietf:params:oauth:token-type:saml2
в subject_token
передаётся
закодированное в BASE64URL содержимое соответствующего маркера доступа.
Примеры
Далее рассматриваются различные сценарии использования протокола обмена маркерами на примере использования в качестве стороннего Центра Идентификации Microsoft Active Directory Federation Service (ADFS).
ADFS поддерживает выпуск JWT маркеров, начиная с версии ОС Windows Server 2012 R2.
Пример 1. OAuth 2.0: код авторизации
Начиная с версии ОС Windows Server 2012 R2 служба ADFS, входящая в её состав, поддерживает один из сценариев протокола OAuth20: сценарий с кодом авторизации.
Процесс авторизации состоит из следующих шагов.
- Формирование запроса на авторизацию в ADFS.
- Получение кода авторизации на ADFS.
- Получение маркера доступа на ADFS.
- Обмен маркера доступа ADFS на маркер доступа ЦИ DSS.
Во всех примерах переносы в теле запроса или URL добавлены для удобства чтения. Маркеры доступа и код авторизации сокращены.
Формирование запроса на авторизацию
Запрос на авторизацию представляет собой URL следующего вида
https://adfs.test-dss.local/adfs/oauth2/authorize
?client_id=oauth-client
&redirect_uri=http%3A%2F%2Flocalhost
&response_type=code
&resource=https%3A%2F%2Fdss.test-dss.local%2FSTS%2FIssue
- client_id - идентификатор OAuth-клиента, зарегистрированного в ADFS.
- redirect_uri - адрес перенаправления для возврата кода авторизации.
- response_type - тип возвращаемого результата.
Для сценария с кодом авторизации всегда
code
. - resource - идентификатор проверяющей стороны DSS, зарегистрированной в ADFS.
Получение кода авторизации
После формирования запроса на авторизацию, сформированный URL необходимо открыть в браузере пользователя.
После этого пользователь должен пройти аутентификацию (если пользователь в домене и использует браузер IE, то это произойдёт автоматически без необходимости вводить доменные учётные данные).
После успешной аутентификации ADFS вернёт следующий HTTP-ответ
HTTP/1.1 302 Found
Location: http://localhost/?code=X0l....
Content-Length: 0
В параметре code
находится код авторизации, используемый на следующем шаге
для получения маркера доступа.
Получение маркера доступа
Для получения маркера доступа необходимо выполнить следующий запрос.
POST /adfs/oauth2/token HTTP/1.1
Host: adfs.test-dss.local
Content-Type: application/x-www-form-urlencoded
grant_type=authorization_code
&client_id=mf-oauth-client
&resource=https%3A%2F%2FDSS-2012.test-dss.local%2FSTS%2Fsts%2Fissue
&code=X0l...
&redirect_uri=http%3A%2F%2Flocalhost
Параметры запроса аналогичны запросу на авторизацию. В параметре code
передаётся кода авторизации.
В ответ ADFS вернёт следующий JSON, содержащий маркер доступа.
{
"access_token": "eyJ0eXAiO...",
"token_type": "bearer",
"expires_in": 3600
}
Обмен маркера доступа ADFS на маркер доступа ЦИ DSS
Полученный на предыдущем шаге маркер доступа ADFS необходимо обменять на маркер ЦИ DSS с помощью запроса, указанного в начале статьи.
POST /STS/oauth/token HTTP/1.1
Host: hostname
Content-Type: application/x-www-form-urlencoded
cache-control: no-cache
grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Atoken-exchange
&client_id=12cf4adb-ba3e-40d0-a5d9-fa507ef26932
&resource=urn%3Acryptopro%3Adss%3Asignserver%3ASignServer
&subject_token=eyJ0
&subject_token_type=urn%3Aietf%3Aparams%3Aoauth%3Atoken-type%3Ajwt
В ответ ЦИ вернёт новый маркер, который необходимо использовать для авторизации запросов к REST API Сервиса Подписи
{
"access_token": "eyJ0eXAi...",
"expires_in": 300,
"token_type": "Bearer"
}
Пример 2. OAuth 2.0: учётные данные владельца ресурсов
Начиная с версии ОС Windows Server 2016 служба ADFS, входящая в её состав, поддерживает один из сценариев протокола OAuth20: сценарий с учётными данными владельца ресурсов.
Процесс авторизации состоит из следующих шагов.
- Формирование запроса на авторизацию в ADFS.
- Получение маркера доступа от ADFS.
- Обмен маркера доступа ADFS на маркер доступа ЦИ DSS.
Формирование запроса на авторизацию
Запрос на авторизацию имеет следующий вид:
POST /adfs/oauth2/token HTTP/1.1
Host: adfs.test-dss.local
Content-Type: application/x-www-form-urlencoded
grant_type=password
&client_id=mf-oauth-client
&resource=https%3A%2F%2FDSS-2012.test-dss.local%2FSTS%2Fsts%2Fissue
&username=test%40tdss.local
&password=1qaz%40WSX
Параметры запроса:
- client_id - идентификатор OAuth-клиента, зарегистрированного в ADFS.
- redirect_uri - адрес перенаправления для возврата кода авторизации.
- resource - идентификатор проверяющей стороны DSS, зарегистрированной в ADFS.
- grant_type - тип разрешения, в данном сценарии всегда имеет значение
password
. - username - логин пользователя.
- password - пароль пользователя.
Получение маркера доступа
В ответ ADFS вернёт ответ в формате JSON, содержащий маркер доступа (в зависимости от настроек ADFS в ответе могут быть и другие маркеры, например, refresh_token и id_token).
{
...
"access_token": "eyJ0eXAiO...",
"token_type": "bearer",
"expires_in": 3600
...
}
Обмен маркера доступа ADFS на маркер доступа ЦИ DSS
Полученный на предыдущем шаге маркер доступа ADFS необходимо обменять на маркер ЦИ DSS с помощью запроса, указанного в начале статьи.
POST /STS/oauth/token HTTP/1.1
Host: hostname
Content-Type: application/x-www-form-urlencoded
cache-control: no-cache
grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Atoken-exchange
&client_id=12cf4adb-ba3e-40d0-a5d9-fa507ef26932
&resource=urn%3Acryptopro%3Adss%3Asignserver%3ASignServer
&subject_token=eyJ0
&subject_token_type=urn%3Aietf%3Aparams%3Aoauth%3Atoken-type%3Ajwt
В ответ ЦИ вернёт новый маркер, который необходимо использовать для авторизации запросов к REST API Сервиса Подписи
{
"access_token": "eyJ0eXAi...",
"expires_in": 300,
"token_type": "Bearer"
}
Пример 3. WS-Trust 1.3: маркер доступа SAML
Маркер доступа SAML может быть получен в ADFS по протоколу WS-Trust.
Процесс авторизации состоит из следующих шагов.
- Формирование запроса на авторизацию в ADFS.
- Получение маркера доступа на ADFS.
- Преобразование содержимого маркера в BASE64URL.
- Обмен маркера доступа ADFS на маркер доступа ЦИ DSS.
Формирование запроса на авторизацию
Запрос в рамках WS-Trust протокола имеет следующий вид:
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<s:Header>
<a:Action s:mustUnderstand="1">http://docs.oasis-open.org/ws-sx/ws-trust/200512/RST/Issue</a:Action>
<a:MessageID>urn:uuid:cec1b3b2-be45-4ac6-9a4e-9dd4f00d2bce</a:MessageID>
<a:ReplyTo>
<a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address>
</a:ReplyTo>
<a:To s:mustUnderstand="1">https://dss-adfs20.dss.cp.ru/adfs/services/trust/13/usernamemixed</a:To>
<o:Security s:mustUnderstand="1" xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<u:Timestamp u:Id="_0">
<u:Created>2019-02-08T12:10:23.864Z</u:Created>
<u:Expires>2019-02-08T12:15:23.864Z</u:Expires>
</u:Timestamp>
<o:UsernameToken u:Id="uuid-d5f0d96d-adee-439b-9b8d-e32728a2c101-2">
<o:Username>sampleuser2@dss.cp.ru</o:Username>
<o:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">P@ssw0rd</o:Password>
</o:UsernameToken>
</o:Security>
</s:Header>
<s:Body>
<trust:RequestSecurityToken xmlns:trust="http://docs.oasis-open.org/ws-sx/ws-trust/200512">
<wsp:AppliesTo xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy">
<wsa:EndpointReference xmlns:wsa="http://www.w3.org/2005/08/addressing">
<wsa:Address>http://hostname/STS/Active.svc/token</wsa:Address>
</wsa:EndpointReference>
</wsp:AppliesTo>
<trust:KeyType>http://docs.oasis-open.org/ws-sx/ws-trust/200512/Bearer</trust:KeyType>
<trust:RequestType>http://docs.oasis-open.org/ws-sx/ws-trust/200512/Issue</trust:RequestType>
</trust:RequestSecurityToken>
</s:Body>
</s:Envelope>
Получение маркера доступа
В ответ сервис вернёт следующие данные:
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<s:Header>
<a:Action s:mustUnderstand="1">http://docs.oasis-open.org/ws-sx/ws-trust/200512/RSTRC/IssueFinal</a:Action>
<a:RelatesTo>urn:uuid:cec1b3b2-be45-4ac6-9a4e-9dd4f00d2bce</a:RelatesTo>
<o:Security s:mustUnderstand="1" xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<u:Timestamp u:Id="_0">
<u:Created>2019-02-08T12:09:37.994Z</u:Created>
<u:Expires>2019-02-08T12:14:37.994Z</u:Expires>
</u:Timestamp>
</o:Security>
</s:Header>
<s:Body>
<trust:RequestSecurityTokenResponseCollection xmlns:trust="http://docs.oasis-open.org/ws-sx/ws-trust/200512">
<trust:RequestSecurityTokenResponse>
<trust:Lifetime>
<wsu:Created xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">2019-02-08T12:09:37.993Z</wsu:Created>
<wsu:Expires xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">2019-02-08T13:09:37.993Z</wsu:Expires>
</trust:Lifetime>
<wsp:AppliesTo xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy">
<wsa:EndpointReference xmlns:wsa="http://www.w3.org/2005/08/addressing">
<wsa:Address>http://hostname/STS/Active.svc/token</wsa:Address>
</wsa:EndpointReference>
</wsp:AppliesTo>
<trust:RequestedSecurityToken>
<xenc:EncryptedData Type="http://www.w3.org/2001/04/xmlenc#Element" xmlns:xenc="http://www.w3.org/2001/04/xmlenc#">
<xenc:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#aes256-cbc"/>
<KeyInfo xmlns="http://www.w3.org/2000/09/xmldsig#">
<e:EncryptedKey xmlns:e="http://www.w3.org/2001/04/xmlenc#">
<e:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#rsa-oaep-mgf1p">
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
</e:EncryptionMethod>
<KeyInfo>
<o:SecurityTokenReference xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<X509Data>
<X509IssuerSerial>
<X509IssuerName>CN=STS</X509IssuerName>
<X509SerialNumber>34807263445560130926767860687597093486</X509SerialNumber>
</X509IssuerSerial>
</X509Data>
</o:SecurityTokenReference>
</KeyInfo>
<e:CipherData>
<e:CipherValue>OlBqsS2HNg5P/86T7hhpRoh4NTopYIFJYKm3AKWuZDO1C8kT83sgd9CePNhtASLvkxOkCRHEniDIfXNwzcq7hJdumAniRNkDjNcmkWpG5DksoggA8Nq83B8avaTic5hA2e9g/L84VDjZQGOu+mM1QR1MerlYmxmMvw80AVqbFZOGAM0Wpqphn0SbDMtTJXVM7Fkcm4Ihkg5Chvqo3IKlUOpodr4o/8D+1IC7d6t0YcqCHTyUUK0/mmUvqfa5cUUQILC94dMHLSsCPhkZG0kpdZoCmZONr/G3yHXpi3zCnGv/myBlgE0ItGymbmp/k/6Y2NsKU4U4mAIaDYAthTvw+g==</e:CipherValue>
</e:CipherData>
</e:EncryptedKey>
</KeyInfo>
<xenc:CipherData>
<xenc:CipherValue>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</xenc:CipherValue>
</xenc:CipherData>
</xenc:EncryptedData>
</trust:RequestedSecurityToken>
<trust:RequestedAttachedReference>
<o:SecurityTokenReference xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<o:KeyIdentifier ValueType="http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.0#SAMLAssertionID">_b3eff871-f427-4715-b69e-20176cbd4342</o:KeyIdentifier>
</o:SecurityTokenReference>
</trust:RequestedAttachedReference>
<trust:RequestedUnattachedReference>
<o:SecurityTokenReference xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<o:KeyIdentifier ValueType="http://docs.oasis-open.org/wss/oasis-wss-saml-token-profile-1.0#SAMLAssertionID">_b3eff871-f427-4715-b69e-20176cbd4342</o:KeyIdentifier>
</o:SecurityTokenReference>
</trust:RequestedUnattachedReference>
<trust:TokenType>urn:oasis:names:tc:SAML:1.0:assertion</trust:TokenType>
<trust:RequestType>http://docs.oasis-open.org/ws-sx/ws-trust/200512/Issue</trust:RequestType>
<trust:KeyType>http://docs.oasis-open.org/ws-sx/ws-trust/200512/Bearer</trust:KeyType>
</trust:RequestSecurityTokenResponse>
</trust:RequestSecurityTokenResponseCollection>
</s:Body>
</s:Envelope>
Преобразование содержимого маркера в BASE64URL
Содержимое маркера расположено в узле RequestedSecurityToken
, если
кодировка ответа UTF-8, то содержимое в BASE64URL примет вид (переносы
строк добавлены для удобства чтения):
PHhlbmM6RW5jcnlwdGVkRGF0YSBUeXBlPSJodHRwOi8vd3d3LnczLm9yZy8yMDA
xLzA0L3htbGVuYyNFbGVtZW50IiB4bWxuczp4ZW5jPSJodHRwOi8vd3d3LnczLm
9yZy8yMDAxLzA0L3htbGVuYyMiPjx4ZW5jOkVuY3J5cHRpb25NZXRob2QgQWxnb
3JpdGhtPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxLzA0L3htbGVuYyNhZXMyNTYt
Y2JjIiAvPjxLZXlJbmZvIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwLzA
5L3htbGRzaWcjIj48ZTpFbmNyeXB0ZWRLZXkgeG1sbnM6ZT0iaHR0cDovL3d3dy
53My5vcmcvMjAwMS8wNC94bWxlbmMjIj48ZTpFbmNyeXB0aW9uTWV0aG9kIEFsZ
29yaXRobT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS8wNC94bWxlbmMjcnNhLW9h
ZXAtbWdmMXAiPjxEaWdlc3RNZXRob2QgQWxnb3JpdGhtPSJodHRwOi8vd3d3Lnc
zLm9yZy8yMDAwLzA5L3htbGRzaWcjc2hhMSIgLz48L2U6RW5jcnlwdGlvbk1ldG
hvZD48S2V5SW5mbz48bzpTZWN1cml0eVRva2VuUmVmZXJlbmNlIHhtbG5zOm89I
mh0dHA6Ly9kb2NzLm9hc2lzLW9wZW4ub3JnL3dzcy8yMDA0LzAxL29hc2lzLTIw
MDQwMS13c3Mtd3NzZWN1cml0eS1zZWNleHQtMS4wLnhzZCI-PFg1MDlEYXRhPjx
YNTA5SXNzdWVyU2VyaWFsPjxYNTA5SXNzdWVyTmFtZT5DTj1TVFM8L1g1MDlJc3
N1ZXJOYW1lPjxYNTA5U2VyaWFsTnVtYmVyPjM0ODA3MjYzNDQ1NTYwMTMwOTI2N
zY3ODYwNjg3NTk3MDkzNDg2PC9YNTA5U2VyaWFsTnVtYmVyPjwvWDUwOUlzc3Vl
clNlcmlhbD48L1g1MDlEYXRhPjwvbzpTZWN1cml0eVRva2VuUmVmZXJlbmNlPjw
vS2V5SW5mbz48ZTpDaXBoZXJEYXRhPjxlOkNpcGhlclZhbHVlPk9sQnFzUzJITm
c1UC84NlQ3aGhwUm9oNE5Ub3BZSUZKWUttM0FLV3VaRE8xQzhrVDgzc2dkOUNlU
E5odEFTTHZreE9rQ1JIRW5pRElmWE53emNxN2hKZHVtQW5pUk5rRGpOY21rV3BH
NURrc29nZ0E4TnE4M0I4YXZhVGljNWhBMmU5Zy9MODRWRGpaUUdPdSttTTFRUjF
NZXJsWW14bU12dzgwQVZxYkZaT0dBTTBXcHFwaG4wU2JETXRUSlhWTTdGa2NtNE
loa2c1Q2h2cW8zSUtsVU9wb2RyNG8vOEQrMUlDN2Q2dDBZY3FDSFR5VVVLMC9tb
VV2cWZhNWNVVVFJTEM5NGRNSExTc0NQaGtaRzBrcGRab0NtWk9Oci9HM3lIWHBp
M3pDbkd2L215QmxnRTBJdEd5bWJtcC9rLzZZMk5zS1U0VTRtQUlhRFlBdGhUdnc
rZz09PC9lOkNpcGhlclZhbHVlPjwvZTpDaXBoZXJEYXRhPjwvZTpFbmNyeXB0ZW
RLZXk-PC9LZXlJbmZvPjx4ZW5jOkNpcGhlckRhdGE-PHhlbmM6Q2lwaGVyVmFsd
WU-eGM4emJOb3U5Slh2UWpSNjFCUUtPb0h6SFNuM3lMek9EQ1FwaDR1L005TTR5
K3d4OFJMV2krTzIzT2d1dFFXY3dtVS9NZmZXWHJ4SkF4YUNGM2lBbkNWVDEwOFN
iMTBVd1hMRjlCNFJtTHQrYXNGWUZ3Tmx0N2ppa2VCb2V0bDBFMzQxSjZ4d25MZ2
cremVDOWllVGNieEZwdENFUmxQUVRFbVZyOEY0NUxuLzhaRG52eVBWQ1RaNVlvZ
URwTEU5bzBTNnJ2R3oveVY4VlEweUR5a0xTcGpEeHpGVDg4K0pkTDhtZjc2Y2Fq
akJLdGdLalZneG1DV0NER0ZWSm9NMjRyRmYxWXBZbGxhQ00zNU9jY1pUVGgra1d
VK20zVFlsdlMzZmVBU1BMczJiNjFCdUp6UnZ2bk8xTm1GWXd1emhKT3FlSHFSZU
F2Q0RRcVR2N1o4RzdueG02eE9wcW9nbDFsWi80WVBFUkxUQ01LcGxCMnBHYkRDW
ndML1hYSnpIRFdNVTRHbld6bkFJVHZ6dGZQUTAvVFl5d0MxOHdFS2VuUzY1YmhE
OUM4VFVKb3ljcisrV3lXZmhjcXJNc1dWWGVTcDhIUVdEWnFXRHhkZEdIWk82SXU
5ZHRSYXQ1WDNWR09pZXo0c3d3MXZydTZvQ252dkFzR0xiYWRQRGgxeU93a2NRaX
pyMUhCN0Z5bzdlNTNYaUU5LzVEQVRwQSsrSTlsdFoxbnJZbE9pOWxHUS8vWTJLK
1pFVURYNElITU80YzE0eUNiT0ROTWMzS3RXZmZ3bHZVT1U4MDhBRGFMRm51djRO
L2d3c0VsZGQwR1ViU0ZLdmtpcU5UY20vcUU5V2NaNGhUdms5RjJJQmhjbmI5MW5
hcTBDUUpydFhmN2dyVTV2cnBFdlRSdkthMnpGQmxqVVQ0NnFCeU1lTkdTMVNUcm
9GdXRpWUxqaDZqY1Bma2VUeWJUWEVxMjNzemhkYTRnbVZ5YjlYNzJNakZQdmViN
GZDR2JRNE1oR29ETndFbW01cWRVWEVBNFF6MGM4ZGZqUWkvb2cxZHMrUWRsZmRX
M0pPclRvTDNsbDZ0QkxDcW16SnJsTGJPakFRd2k0Wm5kZFMrY2xST0U0RkcrRHN
mdDV5eUhJSXhUWFlFdkNBakR6dXFrYllrNEdicktJcjU2R2JOMHVSN29nV1JMWj
VjV0FxaXZGYTV0bVViL0tOL2FrbllQUnZveE9FZW54Q1JZOVdPYzFqa0lPTFJaW
HhMVVFucnZsZmtkblBodjRQT0Z1d1ZESzBKcmxERm9KcjdId29GNkM2Y2RwenVE
UnRYMnRkNmdzNFppTUtIdldQR0hsdUJBa1gzVW00RVFrN2s4WmdCZXNsM3pEVHA
1RzF6NytUQkxQLzhPR1dIbGlSVTFXcnhzVFU5cGFzTys4WUhWVkE1L2gvL3VBcE
1jc1pseGFBNzBkeXVHT240M1dkcGw3YmhIVzIwclZLVXUwczRoY0JMSFhXckwyY
VA3UTFQWGU3NnY4N1cxQ3I1ZDFlRzVMa29xZGFhOHdrWStnaVBYK041Wkt1WEEz
NGpFVEdHTzdoKzZRdHRKY3NNakFucFlNdWVJTDVWclpTb05LSDJhTi81TkE4Wk1
QSGF1OFlxWUFDcFh5L0FPWmR5SDRwZUl0eWNaT1k5Y3ZKbTFUVVdqT202OHdJa2
RzMjBDNS9Md21qTlJjTVhFWlhKVVdyd1Z1d0dua1ppWnBRNEJXWmZGRzFpRStFO
G13N1lZNVlzME1CcDBjcjNtcFQxT2lGTXlhOUVLd2d2aDgycUEreW5GQkRORjBL
bHpOdUFRZ0J2Qi9ud2NlUUhzYnN2WnVqMmRlZVgwL0oxTFFsWnJPQ2M1YWpOUEZ
kVkZsMGd4OVE0N2NpbHlnb21lYllVS2ZWSGIra2RIQVQ0OStsYXc2bDBVcUtCNz
VMckpFUlJpSy9neEk5WnFuamZMaTFZdlpreFJ6Z1U4VU11Z29aVTZYTHBLU2ZKU
nhRbzl6bDJCSTBDcWk3NDF4ZXRWdldxVTBza0Z4bkdtWlZXbENTbU5XdllUYTFh
U0RTM2NpNUk4UGpLcjhObFllZ2NYSmxOY3VMcDF3b1VLVURoUmtFVUVoTy8yeHl
NYzlGdXlPTVQwNzdZM08xWGt0TXVER1ZELzZXbU5MclJCY0xxUE1JSVNFNTRKcG
44Vk95Y28zanc1Y2xmTkh0S2dDbFBpbTZtcjRWTnVzT1U0S1hrdVJ2Zjdhb1BlS
zlVNkpJdk9sK1ZuYzIvdUJLTXRTNDdIbFh0Mk56NWdlVyt6ZVVQOUgrN3lPcFhZ
b1puZkp2OWdYeG9MWEpKa2Rob2ltcnRpbVZwMVVWWW5FcnA2TWZUL0loTlBvdVE
yK2hxY3NsQzA2bWxmOCtaVnA1YTk4bElEajNuRHFoRHZ6VTIzYVhIOEg5b0Rjd0
5pZW5CTkFlak94dXBKbTNndFAreFFESzhSS2RMeWdLSzVLcW02VWlqalpsa3Z2b
zdlbTA4OGViR1ZuaXR0ZVk0ckhRWnNrUnNDbFdaQUlQQWtQTHhuTFNjNitpNklZ
WkR1L3NRY1pEdGNQNXNkSWhMZzQ4V2h1cjBmSUlRcmgzU2tTVExHSTV4c3hEbFd
QODNlNWxqV2phRVplRFE3cUVaRmYyMHFFMEZuYVBUd08xNHJtdDJzS3Vidyttbk
Qrb3p1d29KMkkwOXhOSVpYTWJMWDNoS2VtTjc2NTQyUW1BOUNMZ0lvQjhXeEdDT
UxhbnZkN05PVGw5UTRiT1VxZXlJbzY2TU0vSjNJNzFQZHZvWnd5c3haVTNqNGkr
VmFlWjcrUVNlcWZoLzVKa0gxYmRvUmNtWjNEbjJRbHorSzRrc3B6SUMwZ3A5RG9
KdWdaMWRHVlRhVUF4Y2o1WnJnRHQ5cWthandiMmcraGUxZEVaanI1U1paOGpxZX
Zud1dZNHdaZ2tCNG12SVhIUkhHM2tubzlOVUhOb1o5YlgyNkZEUnV3Mmsza3hFR
TVQcWxKKytKK3lxUWcvOW8xcmcxUFZFUlpCMUc5d3B4cXdlNm9CakN4NElvNWFw
SHBJNXZ5c2VFTnNmZnBoeFpaYVhZaU1hRnh1T3g1UmcyL3FBa3Q1ZytyYVI3Vis
xYnZMZlk5dEVFbFBidmdvOVJHcXplWTFzWUtHWklqZU9oeDJERGdrM1hZTGJObj
NIT2pYVGtYWmFtUGt6VTdSVU9ZZmVXRU5qWkV3d3hjK3dQWm5iYjlncVZwTHd3S
jFaemlJbmdpYnJVL1lSTllXRVpWNzJ2WTh0ZlM0ekREcHBGczBnNXVxc2sxcEZs
SXFTNVpwVXVEaWxVMSs0dDQ1VGswOXZUQmVKTlFIaHZYWEN4cFZHSlVrbkF4ckl
VNHgzUm9sQ3BmVkV1ZGZTUHg3cUdUOWhMV3dkS3hTaGduV3NMNUhta2RETHBGRn
FqbE52M280QW1kbk1KMGxsam01RWZpbFhTQjFqUUZKSU1EbDBPREFwdkxpN1dpN
W9XUG1ER1QybUxiaEpyVU0vRzUzaDBpSXJJNjJuVDBNVStIQTdGeGpodzgyWU0z
elZKdlY0V2pMa1JKSTN6eEw0bDFIS1pZNmZ0d0xXVitBYkc4T0ovZEtxa21NL0N
oME5UWnhnR1V5NUpic2RjdzFiMEVjVFF5YkljbnNrZFM2a3NlOVBCelpzbU9qOE
I2RW5SekJkMHBVM04xRDUrN1F6Ui8xcDkzNUpWWFRnTHFzMkZ0clBLRTZpK0tFT
lAra0loampOdjRQVDg0NE85alY0b0FjWk4vK1NzUERlQmZ3UzZuZGRqTFlMa0hv
eXBydFEzQXNPVEZYQ2ptay90M2U1cW4wVjUyaGtnenI4Z0N0dTNkQ1hxN1FNaUt
MTEY1cTFNQ3VWbnBaSG5XWWxMTXdjbkZ4MCsrREYxWFMzaFZQc0hqajMwUS9kaH
lLcnd5OUM1ZFRJQVpHaTdqVE9uQys0VFZPRVMxQm5KckpxKzVqak5nYmc2blJDT
mxSNjFlZGJISVoyWDJkQjJTajFnYklUUUQzNk5IS1JOckdvVXpBMGJaUW9ycjRh
SlRtY0crZmVxaFVPV0xGeThDdTZQd3dUeUZWTXkyZENoQkUwcDFzNGt0M0hMTHN
3UGs2UjhnRERmMGNhOHRZU0pMUllTTmdldG9Eamc4dWEyT3U2VnB3UDFRNEVIVW
tTR1ErY2tqWURQQTRMRXRuTktwTUpSL1lFOU1xK2NOdzQvNDJVMFdjaEgwTVF1b
HY4STRGSWphS1BBWFVnSmpsdVdmaTRSV3orMXFDRFBKcGdaR1lraUZGY3o5cjEy
QUZvakZ2ZE1GclRrN3E5b29uYkRINXVJZjFmSUpER3U1SmpKTGthSzcvWUhpYk9
HV3VGeFNzODVIVjRpS1JYWFE5Wm90bm1pT2o1cFRpeUhOQzUrRDk5NzhVVm5OWE
FBQ2xqbHJWcHgzRnR6MUNPRmRxdGExM01udlZUWitWZWdTQTJtSlByU2ZJRFJhR
URFQXBub0JZZE5UUlVnd2R0WEI3UE9INGdUaUhLR0JQcmY2S3U1VThtZjVYQnlV
TmlLaHc0c2o4UDFXWmV4NjN5VkhJMXhiMWtUYkYzQU4zTlluL21wdWdoeVZpYTR
3TDBNT0ovN0RlbUUvbFJRNE9LNVVXWG91cGtxTXIzUjJ0c0I0Q3RoSFcyeUowNl
pRYUZjWEovTjgwUGJoQUdSd2h2OFdDWFZ5dk1QazlvUGhiTVlpdmladVh2bTliW
UxWcTVVY3YySmROOE84VDY3WDVhQkpUcW9IR05VNWJrcWxmOVVTZ3BCMWh0R2d5
Q2piejZVamUyUkNRSklUbGtUQys3Z2RoVEdUTkVUendPSWZmcDhGL3pycUVQS1Y
0OE02RXVwMzBTTllMM2tsK21ncE1nMVFZWDVtSFdWd0hSZXlDellKWGVRdjFwWk
ZsWTFzK21XTm1GczRlZUd2MHFSVzU3RDNVZnBJMkFZTmJNbXlERzNjK1VXNUFQW
Wd0NzFzN0ZiYkxqL2IzT1dXUUlkdHJLQlhnTXgxUzAyTGpFcFdDNG1VTnZpNm1C
cExnSWlWVFRubjJaNWh5OHhuTE5ZVGRhU1ZWL1UwT0NaMEFSKzZNNjY3Q3BmcDF
XL1FUWDJmK2pvS1ZNY1ljQ1g5M3pwcVkrdUdFVWk2VFd0TXBSbG5keEVET0pibk
VNenRWSjRyRWRhZFA0MEp0UVFwNm5xWGRuWGNxV1U1dFRPS0FtNlBvalE1TkNqR
3VJRTNQMlNXZ3JsNmpmaC9FZHF3NFpnOG9VZ3FTZXJXRlMwMjg0ZzJ2Q2prR0Jy
M1BLSzE4QklEajZ3MDlHSHNlV0tDR3BzY0JpWklTUDF0Yk9PVTdDMFRyQTU2aFB
6S3JCVXZiQ1lmRkxpeHZSSFUwZVZ3MVhYTFZnNm5kSUxEeUIyaHkvMENRQ09HMV
lrQldnSXpRMnYxN0RucXRqL3pTV3FnenZBc3g4bXpaUnlQNVV1blRvZDhEYTBhU
G5VSG5VbTZheDRjRHJzYTczV2J6L1hFN0NJamY4emhLZ0RnZFhEcTkvbU5IRGo0
enVsTExBS01SN1VqcG1QcGJzQ3E2N291SmcrZWRkbjluK0dOVGl1RlJtQjFuTFc
vbnQrT05Id1dXSHRraEppOEF1RHV2d3BGNnJjNEZHVFBGZyt3M2RZTWRJUk9UMW
FGUG4xSjRleE5ieWZnWE5KQ0VVUlFkVitnWlErODlHZytkdXk3bko2RVdoT045e
VUvNCtrS3Jqb0VoWmxscElzNEZoaStXcVRrUDYwdTg0d0srZjBJSDJuTFlqTzZh
VzhWMm83WkV4S2JydDcyWlJQTzNmbzdCbTY5Y3BPcHJQM3hub29FNlQ3RmRueUl
qNmZXZ0dZVEtHK2g1YjZlZHdxT0oybWQ5OUlHNXc3MUhjbk1sMUlORkxVaGc1Ul
BNUUowQ2Z1VW9WM0toUFdacjVMeXVBYlBwaDR0a2MwL1NyQXJGYVo0eWZkRlIyR
GtHZzhYMWZOZGMxbzNab2RxbjBMcklhNUFiNkdNQ3B4SjB2OXRJQlhPT1FvUFBm
V1VqMXI0R3ZsWFROamgwejVKajlMeWN2bG5CdjJyMzBGelJOdlp6QzlxQUozTjB
PeXUxc3ZSUCsrQU1vOTVPYTVJbS8yNHBQdTJNSnNSaWkwVkFUQ0ZtZ0tSZlRKa2
ozaDQwWWlwcHlFZ29kOWJoZFdZNFpxdDRSbnR3MTIzUzFSWEV2eUxLOUpyZEVpd
zlCYWlKZGx2cHk1R3djQWRlN2dFR1dtZ1NOUk1jVjRxcGd6M1B4K05WMFRUVm0v
dHQwVGE5cDc5UUg1Yi9KelJhTnFKNTE5SEZGbjRZdHFDOHVqaHJIRWs4SHNkekJ
QeGRkMFVxcjVLNUNNYmlDTW44M3lkNFJOcG1zYzNQeVBOeG9ldGpWaWhadjF1Vl
liYlJ0VkYwelhPOEJLV0JlQko2MHFqemxjZzg1OVVQcVVkU21VY3V5MEV1VlI4Q
kNJVWdyVkdiZXV4L1pWU2pJL1ovOWsvKy9rc29OYjdMMlhHbjArRUtETllQbkFM
M2ZZWEIvL1p4M09hMjd3SDAxbXV5RmlmMS9DVXF1NitvMGp2RFZ3cG1EVDdJa1Z
XckozcjBVa1NVY3doRUN2TGcwVDRqdDJ2OXB6K1hMMWJzcW01RmpKMDJiako0OD
BqTDwveGVuYzpDaXBoZXJWYWx1ZT48L3hlbmM6Q2lwaGVyRGF0YT48L3hlbmM6R
W5jcnlwdGVkRGF0YT4
Обмен маркера доступа ADFS на маркер доступа ЦИ DSS
Завершающим шагом данного сценария является обмен маркера SAML на JWT маркер ЦИ DSS с помощью следующего запроса:
POST /STS/oauth/token HTTP/1.1
Host: hostname
Content-Type: application/x-www-form-urlencoded
cache-control: no-cache
grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Atoken-exchange
&client_id=12cf4adb-ba3e-40d0-a5d9-fa507ef26932
&resource=urn%3Acryptopro%3Adss%3Asignserver%3ASignServer
&subject_token=PHhlbmM6R
&subject_token_type=urn%3Aietf%3Aparams%3Aoauth%3Atoken-type%saml1
Здесь в значении subject_token передаётся BASE64URL представление маркера, полученное на предыдущем шаге (в примере запроса оно сокращено).
Пример 4. WS-Trust 1.3: маркер доступа JWT
JWT маркер может быть получен по протоколу WS-Trust Процесс авторизации состоит из следующих шагов.
- Формирование запроса на авторизацию в ADFS.
- Получение маркера доступа на ADFS.
- Преобразование содержимого маркера из BASE64.
- Обмен маркера доступа ADFS на маркер доступа ЦИ DSS.
Формирование запроса на авторизацию
Запрос в рамках WS-Trust протокола имеет следующий вид:
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<s:Header>
<a:Action s:mustUnderstand="1">http://docs.oasis-open.org/ws-sx/ws-trust/200512/RST/Issue</a:Action>
<a:MessageID>urn:uuid:ef4d294e-b49a-44ad-8ad5-e15fe22389db</a:MessageID>
<a:ReplyTo>
<a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address>
</a:ReplyTo>
<a:To s:mustUnderstand="1">https://simadfs.cryptopro.ru/adfs/services/trust/13/usernamemixed</a:To>
<o:Security s:mustUnderstand="1" xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<u:Timestamp u:Id="_0">
<u:Created>2019-02-11T07:07:09.031Z</u:Created>
<u:Expires>2019-02-11T07:12:09.031Z</u:Expires>
</u:Timestamp>
<o:UsernameToken u:Id="uuid-41f7fc65-1d07-4dc8-b72c-0b3a76fa9b74-2">
<o:Username>test@tdss.local</o:Username>
<o:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">1qaz@WSX</o:Password>
</o:UsernameToken>
</o:Security>
</s:Header>
<s:Body>
<trust:RequestSecurityToken xmlns:trust="http://docs.oasis-open.org/ws-sx/ws-trust/200512">
<wsp:AppliesTo xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy">
<wsa:EndpointReference xmlns:wsa="http://www.w3.org/2005/08/addressing">
<wsa:Address>urn:cryptopro:dss:samples</wsa:Address>
</wsa:EndpointReference>
</wsp:AppliesTo>
<trust:KeyType>http://docs.oasis-open.org/ws-sx/ws-trust/200512/Bearer</trust:KeyType>
<trust:RequestType>http://docs.oasis-open.org/ws-sx/ws-trust/200512/Issue</trust:RequestType>
<trust:TokenType>urn:ietf:params:oauth:token-type:jwt</trust:TokenType>
</trust:RequestSecurityToken>
</s:Body>
</s:Envelope>
Получение маркера доступа
В ответ сервис вернёт следующие данные:
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing" xmlns:u="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
<s:Header>
<a:Action s:mustUnderstand="1">http://docs.oasis-open.org/ws-sx/ws-trust/200512/RSTRC/IssueFinal</a:Action>
<a:RelatesTo>urn:uuid:ef4d294e-b49a-44ad-8ad5-e15fe22389db</a:RelatesTo>
<o:Security s:mustUnderstand="1" xmlns:o="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">
<u:Timestamp u:Id="_0">
<u:Created>2019-02-11T07:07:52.740Z</u:Created>
<u:Expires>2019-02-11T07:12:52.740Z</u:Expires>
</u:Timestamp>
</o:Security>
</s:Header>
<s:Body>
<trust:RequestSecurityTokenResponseCollection xmlns:trust="http://docs.oasis-open.org/ws-sx/ws-trust/200512">
<trust:RequestSecurityTokenResponse>
<trust:Lifetime>
<wsu:Created xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">2019-02-11T07:07:52.693Z</wsu:Created>
<wsu:Expires xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">2019-02-11T08:07:52.693Z</wsu:Expires>
</trust:Lifetime>
<wsp:AppliesTo xmlns:wsp="http://schemas.xmlsoap.org/ws/2004/09/policy">
<wsa:EndpointReference xmlns:wsa="http://www.w3.org/2005/08/addressing">
<wsa:Address>urn:cryptopro:dss:samples</wsa:Address>
</wsa:EndpointReference>
</wsp:AppliesTo>
<trust:RequestedSecurityToken>
<wsse:BinarySecurityToken wsu:Id="_081a18a3-68d0-49e9-9515-c46d1bd48c50-0465E3D60128657379D25AB0189F70B8" ValueType="urn:ietf:params:oauth:token-type:jwt" EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">ZXlKMGVYQWlPaUpLVjFRaUxDSmhiR2NpT2lKU1V6STFOaUlzSW5nMWRDSTZJamhPYmxWVVFsOTFRbFZ6Y1hwbVNuSlVNMWcyTTA1M2JVaEZPQ0o5LmV5SmhkV1FpT2lKMWNtNDZZM0o1Y0hSdmNISnZPbVJ6Y3pwellXMXdiR1Z6SWl3aWFYTnpJam9pYUhSMGNEb3ZMM05wYldGa1puTXVZM0o1Y0hSdmNISnZMbkoxTDJGa1puTXZjMlZ5ZG1salpYTXZkSEoxYzNRaUxDSnBZWFFpT2pFMU5EazROamc0TnpJc0ltVjRjQ0k2TVRVME9UZzNNalEzTWl3aVlYVjBhRzFsZEdodlpDSTZJbWgwZEhBNkx5OXpZMmhsYldGekxtMXBZM0p2YzI5bWRDNWpiMjB2ZDNNdk1qQXdPQzh3Tmk5cFpHVnVkR2wwZVM5aGRYUm9aVzUwYVdOaGRHbHZibTFsZEdodlpDOXdZWE56ZDI5eVpDSXNJbUYxZEdoZmRHbHRaU0k2SWpJd01Ua3RNREl0TVRGVU1EYzZNRGM2TlRFdU56Y3hXaUlzSW5abGNpSTZJakV1TUNKOS5hbGdsNmN6Skc3U1dTTy0yb3NUelJEQm5VOVFfWVh4c0t6bjRnY3VYdXFvS2FrRVUxUEhOTWJUSXdhRTlPb1hNU014T3hDcElOTUd6amlUS2R1N3N5YmppbXppQV9xZmdZYmw2clNFdTZUM3plQk1nczJfUV8wUlpoRUZvV1BGT3JNZjhIQllJa3RlQkJ0SHlmNDJyS3lVdmxVOGdQWTY4U0J5eTVvN2NEVlA2eTVNLXloWWpBanBUX19yVEZTN0otU3NzX1ZBQWxsM0lLUjZ0QXBVVWI1TTBlNjh1ZEdxc3g0VmR1TFNtaHloV0JDNUlXQTlTWkg3QWJObVBLWTU1bkFCNFVwWnFBWjZrN2xjV1Zjbm54bms5anA0YjlkX2hZdmlSN1Z2LU42U1pVeGE4ckNOcERXVGlRZW5Yb01GVmQ3Ymp4Q0dnWUY2NDMzaHg4TlhSWnc=</wsse:BinarySecurityToken>
</trust:RequestedSecurityToken>
<trust:TokenType>urn:ietf:params:oauth:token-type:jwt</trust:TokenType>
<trust:RequestType>http://docs.oasis-open.org/ws-sx/ws-trust/200512/Issue</trust:RequestType>
<trust:KeyType>http://docs.oasis-open.org/ws-sx/ws-trust/200512/Bearer</trust:KeyType>
</trust:RequestSecurityTokenResponse>
</trust:RequestSecurityTokenResponseCollection>
</s:Body>
</s:Envelope>
В узле BinarySecurityToken
сожержится JWT маркер закодированный в BASE64.
Преобразование содержимого маркера из BASE64
Для получения JWT-маркера доступа необходимо преобразовать содержимое узла
BinarySecurityToken
из BASE64 и рассмотреть полученный массив байтов как
строку в кодировке UTF-8.
Строка (переносыстрок добавлены для удобства чтения):
ZXlKMGVYQWlPaUpLVjFRaUxDSmhiR2NpT2lKU1V6STFOaUlzSW5nMWRDSTZJamhP
YmxWVVFsOTFRbFZ6Y1hwbVNuSlVNMWcyTTA1M2JVaEZPQ0o5LmV5SmhkV1FpT2lK
MWNtNDZZM0o1Y0hSdmNISnZPbVJ6Y3pwellXMXdiR1Z6SWl3aWFYTnpJam9pYUhS
MGNEb3ZMM05wYldGa1puTXVZM0o1Y0hSdmNISnZMbkoxTDJGa1puTXZjMlZ5ZG1s
alpYTXZkSEoxYzNRaUxDSnBZWFFpT2pFMU5EazROamc0TnpJc0ltVjRjQ0k2TVRV
ME9UZzNNalEzTWl3aVlYVjBhRzFsZEdodlpDSTZJbWgwZEhBNkx5OXpZMmhsYldG
ekxtMXBZM0p2YzI5bWRDNWpiMjB2ZDNNdk1qQXdPQzh3Tmk5cFpHVnVkR2wwZVM5
aGRYUm9aVzUwYVdOaGRHbHZibTFsZEdodlpDOXdZWE56ZDI5eVpDSXNJbUYxZEdo
ZmRHbHRaU0k2SWpJd01Ua3RNREl0TVRGVU1EYzZNRGM2TlRFdU56Y3hXaUlzSW5a
bGNpSTZJakV1TUNKOS5hbGdsNmN6Skc3U1dTTy0yb3NUelJEQm5VOVFfWVh4c0t6
bjRnY3VYdXFvS2FrRVUxUEhOTWJUSXdhRTlPb1hNU014T3hDcElOTUd6amlUS2R1
N3N5YmppbXppQV9xZmdZYmw2clNFdTZUM3plQk1nczJfUV8wUlpoRUZvV1BGT3JN
ZjhIQllJa3RlQkJ0SHlmNDJyS3lVdmxVOGdQWTY4U0J5eTVvN2NEVlA2eTVNLXlo
WWpBanBUX19yVEZTN0otU3NzX1ZBQWxsM0lLUjZ0QXBVVWI1TTBlNjh1ZEdxc3g0
VmR1TFNtaHloV0JDNUlXQTlTWkg3QWJObVBLWTU1bkFCNFVwWnFBWjZrN2xjV1Zj
bm54bms5anA0YjlkX2hZdmlSN1Z2LU42U1pVeGE4ckNOcERXVGlRZW5Yb01GVmQ3
Ymp4Q0dnWUY2NDMzaHg4TlhSWnc=
будет соответстсвовать следующему JWT-маркеру:
eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6IjhOblVUQl91QlVzcXpmS
nJUM1g2M053bUhFOCJ9.eyJhdWQiOiJ1cm46Y3J5cHRvcHJvOmRzczpzYW1wbGVzI
iwiaXNzIjoiaHR0cDovL3NpbWFkZnMuY3J5cHRvcHJvLnJ1L2FkZnMvc2VydmljZX
MvdHJ1c3QiLCJpYXQiOjE1NDk4Njg4NzIsImV4cCI6MTU0OTg3MjQ3MiwiYXV0aG1
ldGhvZCI6Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vd3MvMjAwOC8wNi9p
ZGVudGl0eS9hdXRoZW50aWNhdGlvbm1ldGhvZC9wYXNzd29yZCIsImF1dGhfdGltZ
SI6IjIwMTktMDItMTFUMDc6MDc6NTEuNzcxWiIsInZlciI6IjEuMCJ9.algl6czJG
7SWSO-2osTzRDBnU9Q_YXxsKzn4gcuXuqoKakEU1PHNMbTIwaE9OoXMSMxOxCpINM
GzjiTKdu7sybjimziA_qfgYbl6rSEu6T3zeBMgs2_Q_0RZhEFoWPFOrMf8HBYIkte
BBtHyf42rKyUvlU8gPY68SByy5o7cDVP6y5M-yhYjAjpT__rTFS7J-Sss_VAAll3I
KR6tApUUb5M0e68udGqsx4VduLSmhyhWBC5IWA9SZH7AbNmPKY55nAB4UpZqAZ6k7
lcWVcnnxnk9jp4b9d_hYviR7Vv-N6SZUxa8rCNpDWTiQenXoMFVd7bjxCGgYF6433
hx8NXRZw
Обмен маркера доступа ADFS на маркер доступа ЦИ DSS
Полученный на предыдущем шаге маркер доступа ADFS необходимо обменять на маркер ЦИ DSS с помощью запроса, указанного в начале статьи.
POST /STS/oauth/token HTTP/1.1
Host: hostname
Content-Type: application/x-www-form-urlencoded
cache-control: no-cache
grant_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Atoken-exchange
&client_id=12cf4adb-ba3e-40d0-a5d9-fa507ef26932
&resource=urn%3Acryptopro%3Adss%3Asignserver%3ASignServer
&subject_token=eyJ0
&subject_token_type=urn%3Aietf%3Aparams%3Aoauth%3Atoken-type%3Ajwt
В ответ ЦИ вернёт новый маркер, который необходимо использовать для авторизации запросов к REST API Сервиса Подписи
{
"access_token": "eyJ0eXAi...",
"expires_in": 300,
"token_type": "Bearer"
}