182 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
		
		
			
		
	
	
			182 lines
		
	
	
		
			10 KiB
		
	
	
	
		
			Markdown
		
	
	
	
	
	
|   | --- | |||
|  | title: OAuth2 Protocol | |||
|  | localeTitle: Протокол OAuth2 | |||
|  | --- | |||
|  | ## OAuth 2.0
 | |||
|  | 
 | |||
|  | [OAuth 2.0](https://tools.ietf.org/html/rfc6749) является стандартным протоколом авторизации, который позволяет стороннему приложению иметь ограниченный доступ к ресурсам от имени владельца ресурса (пользователей системы) | |||
|  | 
 | |||
|  | OAuth широко используется во многих крупных интернет-компаниях, таких как Google, Facebook, Slack и т. Д. | |||
|  | 
 | |||
|  | **Оглавление** | |||
|  | 
 | |||
|  | *   Базовые знания | |||
|  | *   Поток протокола | |||
|  | *   Типы разрешений авторизации | |||
|  | *   Рекомендации | |||
|  | 
 | |||
|  | ### Базовые знания
 | |||
|  | 
 | |||
|  | #### [Роли](https://tools.ietf.org/html/rfc6749#section-1.1)
 | |||
|  | 
 | |||
|  | *   **Владелец ресурса** : Лицо, использующее продукт или услугу (например: владелец ресурса в своем аккаунте Google) | |||
|  | *   **Сервер ресурсов** : Сервер, на котором хранятся данные, защищенные клиентами (например, Gmail, на котором размещаются ваши электронные письма) | |||
|  | *   **Клиент** : Приложение, запрашивающее доступ к данным на сервере ресурсов | |||
|  | *   **Сервер авторизации** : Сервер, который обрабатывает запрос авторизации, выдаёт маркер доступа запрашивающему клиенту. Этот сервер может быть таким же, как сервер ресурсов, или может быть отдельным сервером | |||
|  | 
 | |||
|  | #### Лексемы
 | |||
|  | 
 | |||
|  | В OAuth 2.0 есть два типа токенов | |||
|  | 
 | |||
|  | *   **[Токен доступа](https://tools.ietf.org/html/rfc6749#section-1.4)** : Токены доступа являются важной частью OAuth, поскольку он позволяет получать доступ к пользовательским данным из любого приложения, которое содержит этот токен. Этот токен имеет ограниченный срок службы, определенный сервером авторизации. | |||
|  | *   **[Обновить токен](https://tools.ietf.org/html/rfc6749#section-1.5)** : Этот токен выдается как часть токена доступа, поскольку токен доступа имеет ограниченный срок службы, иногда клиентскому приложению требуется доступ к пользовательским данным в течение более длительного времени (например, услуги интеграции), в этом случае клиентское приложение может запросить токен обновления, который позволяет им чтобы обновить токен доступа, чтобы получить более новый, который требует повторного авторизации пользователя. | |||
|  | 
 | |||
|  | #### [Область доступа к токену](https://tools.ietf.org/html/rfc6749#section-3.3)
 | |||
|  | 
 | |||
|  | Параметр области в запросе авторизации клиентом позволяет клиентскому приложению указывать, какой тип ресурсов или данных они хотят получить доступ, доступные области определяются сервером авторизации и после авторизации запрашиваемые области привязаны к токену доступа, дают токен доступа ограничивает доступ к пользовательским данным вместо полного доступа. | |||
|  | 
 | |||
|  | ### [Поток протокола](https://tools.ietf.org/html/rfc6749#section-1.2)
 | |||
|  | 
 | |||
|  |  | |||
|  | 
 | |||
|  | ### Типы разрешений авторизации
 | |||
|  | 
 | |||
|  | OAuth2 определил 4 типа грантов для получения токенов доступа в зависимости от характера клиента. | |||
|  | 
 | |||
|  | *   Код авторизации | |||
|  | *   Неявный поток | |||
|  | *   Учетные данные владельца ресурса | |||
|  | *   Учетные данные клиента | |||
|  | 
 | |||
|  | #### Грант авторизационного кода
 | |||
|  | 
 | |||
|  | Характер клиента: | |||
|  | 
 | |||
|  | Клиент, который может безопасно хранить секрет клиента (как правило, веб-сервер), может использовать этот грант для авторизации. Это также позволяет получить долгоживущий токен доступа с помощью токена обновления. | |||
|  | 
 | |||
|  | Например: запрос веб-приложения для доступа к информации пользователя учетной записи Google | |||
|  | 
 | |||
|  | Абстрактный поток | |||
|  | 
 | |||
|  |  | |||
|  | 
 | |||
|  | Пример кода: | |||
|  | 
 | |||
|  | запрос авторизации | |||
|  | ``` | |||
|  | GET /oauth2/authorize?response_type=code  | |||
|  |  &client_id=client123&scope=profile  | |||
|  |  &redirect_uri=https://client.com/callback HTTP/1.1  | |||
|  |  Host: auth.server.com  | |||
|  | ``` | |||
|  | 
 | |||
|  | ``` | |||
|  | HTTP/1.1 302 Found  | |||
|  |  Location: https://client.com/callback#code=sb8s6doy9bsd9sd&state=abcde  | |||
|  | ``` | |||
|  | 
 | |||
|  | после получения авторизационного кода, запрос на авторизационный сервер с кодом, | |||
|  | ``` | |||
|  | POST /oauth2/token HTTP/1.1  | |||
|  |  Host: auth.server.com  | |||
|  |  Content-Type: application/x-www-form-urlencoded  | |||
|  |   | |||
|  |  grant_type=authorization_code  | |||
|  |  &code=sb8s6doy9bsd9sd  | |||
|  |  &redirect_uri=https://client.com/callback  | |||
|  |  &client_id=client123  | |||
|  |  &client_secret=secret  | |||
|  |  &scope=profile  | |||
|  | ``` | |||
|  | 
 | |||
|  | ответ | |||
|  | ``` | |||
|  | HTTP/1.1 200 OK  | |||
|  |  Content-Type: application/json;charset=UTF-8  | |||
|  |  Cache-Control: no-store  | |||
|  |  Pragma: no-cache  | |||
|  |  {  | |||
|  |   "access_token":"gsi8d6fosb9d6fos6df",  | |||
|  |   "token_type":"bearer",  | |||
|  |   "expires_in":3600  | |||
|  |  }  | |||
|  | ``` | |||
|  | 
 | |||
|  | #### Неявный поток
 | |||
|  | 
 | |||
|  | Характер клиента: | |||
|  | 
 | |||
|  | Клиентское приложение, запущенное в браузере, обычно использует внешние приложения (например: SPA). Этот грант не выдает токен обновления. | |||
|  | 
 | |||
|  | Например: внешнее приложение javascript, запущенное в браузере | |||
|  | 
 | |||
|  | Абстрактный поток: | |||
|  | 
 | |||
|  |  | |||
|  | 
 | |||
|  | Образец кода: | |||
|  | ``` | |||
|  | GET /oauth2/authorize?response_type=token  | |||
|  |  &client_id=client123  | |||
|  |  &redirect_uri=https://client.com/callback HTTP/1.1  | |||
|  |  Host: auth.server.com  | |||
|  | ``` | |||
|  | 
 | |||
|  | ``` | |||
|  | HTTP/1.1 302 Found  | |||
|  |  Location: https://client.com/callback#access_token=98y2b38&token_type=bearer&expires_in=3600&state=abcde  | |||
|  | ``` | |||
|  | 
 | |||
|  | #### Учетные данные владельца ресурса
 | |||
|  | 
 | |||
|  | Характер клиента: | |||
|  | 
 | |||
|  | В этом потоке владелец ресурса делит свои учетные данные (пароль) с клиентом, а затем на сервер авторизации, поэтому этот грант используется, когда они являются абсолютным доверием между клиентским приложением и сервером авторизации. Таким образом, этот поток в основном не разрешен для сторонних клиентских приложений. | |||
|  | 
 | |||
|  | Например: мобильные приложения Facebook, используя этот поток для авторизации с помощью Facebook Server | |||
|  | 
 | |||
|  | Абстрактный поток: | |||
|  | 
 | |||
|  |  | |||
|  | 
 | |||
|  | Образец кода: | |||
|  | ``` | |||
|  | POST /oauth2/token HTTP/1.1  | |||
|  |  Host: auth.server.com  | |||
|  |  Content-Type: application/x-www-form-urlencoded  | |||
|  |   | |||
|  |  grant_type=password  | |||
|  |  &username=john  | |||
|  |  &password=abcde  | |||
|  | ``` | |||
|  | 
 | |||
|  | #### Поток клиентских учетных данных
 | |||
|  | 
 | |||
|  | Характер клиента: | |||
|  | 
 | |||
|  | Этот тип авторизации используется, когда клиент сам является владельцем ресурса (т.е. клиент хочет получить доступ к своему пределу использования или связанной с ним информации). В этом потоке нет авторизации конечного пользователя. | |||
|  | 
 | |||
|  | Например: клиентское приложение, запрашивающее данные не пользователей с серверов google (например: часовые пояса, карты и т. Д.), | |||
|  | 
 | |||
|  | Абстрактный поток: | |||
|  | 
 | |||
|  |  | |||
|  | 
 | |||
|  | Образец кода: | |||
|  | ``` | |||
|  | POST /oauth2/token HTTP/1.1  | |||
|  |  Host: auth.server.com  | |||
|  |  Content-Type: application/x-www-form-urlencoded  | |||
|  |   | |||
|  |  grant_type=client_credentials  | |||
|  |  &client_id=client123  | |||
|  |  &client_secret=xyz123  | |||
|  | ``` | |||
|  | 
 | |||
|  | ### Рекомендации
 | |||
|  | 
 | |||
|  | Для получения дополнительной информации см. | |||
|  | 
 | |||
|  | *   [OAuth2 Draft](https://tools.ietf.org/html/rfc6749) | |||
|  | *   [Понимание OAuth2](http://www.bubblecode.net/en/2016/01/22/understanding-oauth2/) | |||
|  | *   [Создание собственного сервера подключений openId](http://kevinchalet.com/2016/07/13/creating-your-own-openid-connect-server-with-asos-choosing-the-right-flows/) |