Общие сведения

Провайдер аутентификации сервиса 1cFresh позволяет войти в приложение пользователя из стороннего сервиса без использования дополнительной аутентификации и авторизации.

Этот способ аутентификации предназначен для организации "прозрачного" входа по технологии единого входа (Single Sign-On), когда пользователь уже работает в своем личном кабинете в стороннем (по отношению к 1cFresh) сервисе.

Организация единого входа возможна 2-мя способами:

  1. Если сторонний сервис поддерживает технологию OAuth2 или OpenID-Connect,  то на стороне сервиса 1cFresh выполняются настройки.
  2. Если сторонний сервис не поддерживает технологию OAuth2 или OpenID-Connect, то на стороне этого сервиса должна быть выполнена разработка для обеспечения поддержки прозрачной аутентификации.

Настройка сервиса 1cFresh для "прозрачного" входа из сервисов, поддерживающих OAuth2 и OpenID-Connect описана в главе "Использование сторонних провайдеров аутентификации" документа "1С:Технология публикации решений 1cFresh".

Ниже рассмотрена схема работы, которую должен поддержать сервис, не поддерживающий OAuth2 или OpenID-Connect

Схема работы без использования OAuth2 и OpenId-connect

Вход в приложение

Процесс входа пользователя в приложение сервиса 1cFresh по технологии единого входа без использования OAuth2 или OpenID-Connect:

  1. Обслуживающая организация перенаправляет пользователя на адрес OpenID-провайдера методом POST. В теле запроса содержатся данные аутентификации, адрес приложения, одноразовый ключ (вместо пароля).
  2. Данные верифицируются OpenId-провайдером с помощью симметричной подписи без обращению к провайдеру.
  3. Устанавливает cookie одноразового входа.
  4. OpenID-провайдер перенаправляет пользователя на адрес приложения.
  5. Приложение перенаправляет пользователя на OpenID-провайдер и передает OpenID-провайдеру ранее установленную им cookie (это стандартная схема работы с OpenID-провайдером).
  6. OpenID-провайдер обнаруживает cookie и перенаправляет пользователя на приложение с разрешением входа.

Получение секретного ключа

Для подписи данных авторизации используется секретный ключ. Секретный ключ генерируется OpenID-провайдером сервиса 1cFresh.

Возможны 2 варианта автоматизированного получения секретного ключа:

  1. Периодическая отправка ключа, инициируемая сервисом 1cFresh
  2. Отправка ключа по запросу от обслуживающей организации

Для обоих вариантов на стороне обслуживающей организации разворачивается отдельный HTTP-сервис, на который сервис 1cFresh отправляет секретный ключ. Если в ответ на POST-запрос к этому сервису получен ответ с кодом 200, то это считается подтверждением получения секретного ключа. Адрес и параметры доступа к сервису получения секретного ключа задаются администратором сервиса 1cFresh в настройках поставщика удостоверений сквозной аутентификации. Для доступа к серверу обслуживающей организации может использоваться пользовательский сертификат.

На адрес сервиса для передачи ключа приходит запрос с разметкой JSON c данными:

  • id - идентификатор ключа подписи
  • expired - срок действия ключа подписи
  • key - двоичные данные ключа подписи в формате base64
Пример данных ключа подписи
{
"id": "19ab9b16-3262-49da-93a6-beef57a5e9fa",
"expired": "2018-08-10T09:43:42",
"key": "VT/QeNEo4yPotXZT6YNC2RHJwub4pAPqGs6Lq2Kbeqg="
}

Переданный ключ используется для подписи запросов с помощью алгоритма HMACSHA256.

Запросы на получение секретного ключа обслуживающей организацией

Для получения ключа по запросу обслуживающая организация может использовать методы внешнего программного интерфейса:

  • account/update_sso_key - выполняет запрос на отправку обновления ключа SSO авторизации
  • account/confirm_sso_key - подтверждает получение ключа SSO авторизации
  • account/truncate_sso_key - удаляет все ключи SSO авторизации кроме актуального.

Параметры запроса к Open-ID провайдеру

Имя

Описание

Обязательный

Пример

1
server

Адрес OpenID провайдера сервериса

Даhttps://stage.1cfresh.com/a/oid/hs/oid2op
2
assoc_handle
Идентификатор секретного ключа, генерируется на стороне OpenId провайдера и передается вместе с данными ключа для подписи.

Да

f5b66343-59bb-423a-8176-031a8f4f0ed3
3
response_nonce

Одноразовый номер для защиты от атак повторного использования (дата в формате XML до Z + GUID)

Генерируется обслуживающей организацией при каждом запросе.

Да

2017-11-16T09:31:34Zeab4f5ad-4bfa-4d8c-a1d3-f4bc08234bbf
4
provider
Уникальный код обслуживающей организации

Да

987
5
user_id
Уникальный идентификатор пользователя сервиса (GUID)Да*85e87f4f-0100-11e8-819b-0050568925e0
6
user
Логин пользователя в сервисе 1cFresh

Да*

user.95@yopmail.com
7
tenant

Номер области данных пользователя

Да

365
8
sig

Подпись данных обслуживающей организации в формате Base64. Порядок значений для вычисления подписи:

  1. assoc_handle
  2. response_nonce
  3. provider
  4. user_id
  5. user
  6. tenant

Да

5lm3OTtPXcpvopR0ueIYDncvgNOmCq/ZP088lm2xnMU=

Алгоритм вычисления подписи на псевдокоде:

sig = Base64Строка(HMACSHA256(assoc_handle + response_nonce + provider + user_id + user + tenant, key))

Например, на языке C# эти действия могут быть выполнены инструкциями:

var data = Encoding.UTF8.GetBytes(assoc_handle + response_nonce + provider + user_id + user + tenant);
var sig = (new HMACSHA256(key)).ComputeHash(data);
9
anchor
Якорь на данные в приложении
e1cib/command/ОбщаяКоманда.МониторОсновныхПоказателей

* Для входа можно использовать идентификатор пользователя (user_id) или логин пользователя (user).

Пример страницы для перенаправления пользователя в приложение

Шаблон HTML-страницы
<!DOCTYPE html>
<html>
  <head>
  <meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
  <meta http-equiv='pragma' content='no-cache'/>
  <meta http-equiv='cache-control' content='no-cache'/>
  <meta http-equiv='expires' content='-1'/>
</head>
  <body onload='document.forms.form.submit()'>
    <form name='form' action='{{server}}' method='post'>
      <input type='hidden' name='assoc_handle' value='{{assoc_handle}}'/>
      <input type='hidden' name='response_nonce' value='{{response_nonce}}'/>
      <input type='hidden' name='provider' value='{{provider}}'/>
      <input type='hidden' name='user_id' value='{{user_id}}'/>
      <input type='hidden' name='user' value='{{user}}'/>
      <input type='hidden' name='tenant' value='{{tenant}}'/>
      <input type='hidden' name='sig' value='{{sig}}'/>
      <input type='hidden' name='anchor' value='{{anchor}}'/>
    </form>
  </body>
</html>
Пример HTML-страницы
<!DOCTYPE html>
<html>
	<head>
		<meta http-equiv='Content-Type' content='text/html; charset=utf-8'>
		<meta http-equiv='pragma' content='no-cache'/>
		<meta http-equiv='cache-control' content='no-cache'/>
		<meta http-equiv='expires' content='-1'/>
	</head>
	<body onload='document.forms.form.submit()'>
		<form name='form' action='https://stage.1cfresh.com/a/oid/hs/oid2op?cmd=sso' method='post'>
			<input type='hidden' name='assoc_handle' value='f5b66343-59bb-423a-8176-031a8f4f0ed3'/>
			<input type='hidden' name='response_nonce' value='2017-11-16T09:31:34Zeab4f5ad-4bfa-4d8c-a1d3-f4bc08234bbf'/>
			<input type='hidden' name='provider' value='987'/>
			<input type='hidden' name='user' value='user.95@yopmail.com'/>
			<input type='hidden' name='user_id' value=''/>
			<input type='hidden' name='tenant' value='365'/>
			<input type='hidden' name='sig' value='5lm3OTtPXcpvopR0ueIYDncvgNOmCq/ZP088lm2xnMU='/>
			<input type='hidden' name='anchor' value=''/>
		</form>
	</body>
</html>


Необходимо перенаправлять пользователя на эту HTML страницу в момент нажатия ссылки на вход в приложение.