Содержание
- 1 Введение
- 2 SessionAuthentication
- 3 Выучить больше
- 4 Release History
- 5 Quickstart
- 6 Создание файла . htpasswd
- 7 Надежность авторизации
- 8 Proxy Configuration
- 9 Overview
- 10 2. Basic Authentication With the API
- 11 3. Preemptive Basic Authentication
- 12 4. Basic Auth With Raw HTTP Headers
- 13 5. Conclusion
- 14 Store
- 15 Basic аутентификация
- 16 Models
- 17 Безопасность
- 18 Release History
Введение
Когда я говорил семье или друзьям, что я «работаю в identity», они часто предполагали, что это означает, что я работал в правительстве, в организации выдающей водительские права, или что я помогал людям разрешать мошенничество с кредитными картами.
Однако ни то, ни другое не было правдой. Ранее я работал в компании Auth0,, которая управляет цифровой идентификацией. (Сейчас я являюсь участником программы Auth0 Ambassadors и являюсь экспертом Google Developer по SPPI: Security, Privacy, Payments, and Identity — безопасность, конфиденциальность, платежи и идентификация.)
Цифровая идентификация
Цифровая идентификация это набор атрибутов, которые определяют отдельного пользователя в контексте функции, предоставляемой конкретным приложением.
Что это значит?
Скажем, вы управляете компанией по продаже обуви онлайн. Цифровой идентификацией пользователей вашего приложения может быть номер их кредитной карты, адрес доставки и история покупок. Их цифровая идентификация зависит от вашего приложения.
Это приводит нас к …
Аутентификация
В широком смысле, аутентификация относится к процессу проверки того, что пользователь является тем, кем он себя заявляет.
Как только система сможет установить это, мы приходим к …
Стандарты
Вы можете вспомнить, что я упомянул, что аутентификация основывается на четко определенных стандартах. Но откуда эти стандарты берутся?
Есть много разных стандартов и организаций, которые управляют работой Интернета. Два органа, которые представляют для нас особый интерес в контексте аутентификации и авторизации, — это Инженерная рабочая группа по Интернету (Internet Engineering Task Force — IETF) и Фонд OpenID (OpenID Foundation — OIDF).
IETF (Internet Engineering Task Force)
IETF — это большое открытое международное сообщество сетевых инженеров, операторов, поставщиков и исследователей, которые занимаются развитием интернет-архитектуры и бесперебойной работой интернета.
OIDF (OpenID Foundation)
OIDF — это некоммерческая международная организация людей и компаний, которые стремятся обеспечить, продвигать и защищать технологии OpenID.
Теперь, когда нам известны спецификации и кто их пишет, давайте вернемся к авторизации и поговорим о:
OAuth 2.0
OAuth 2.0 является одной из наиболее часто упоминаемых спецификаций, когда речь идет о сети, а также часто неправильно представленной или неправильно понятой.
OAuth не является спецификацией аутентификации. OAuth имеет дело с делегированной авторизацией. Помните, что аутентификация — это проверка личности пользователя. Авторизация касается предоставления или отказа в доступе к ресурсам. OAuth 2.0 предоставляет доступ к приложениям от имени пользователей.
Как было до OAuth
Чтобы понять цель OAuth, нам нужно вернуться назад во времени. OAuth 1.0 был создан в декабре 2007 года. До этого, если нам требовался доступ к сторонним ресурсам, это выглядело так:
Допустим, вы использовали приложение под названием HireMe123. HireMe123 хочет настроить событие календаря (например, встречу на собеседование) от вашего имени (пользователя). HireMe123 не имеет собственного календаря; поэтому нужно использовать другой сервис под названием MyCalApp для добавления событий.
После того, как вы вошли в HireMe123, HireMe123 запросит у вас ваши учетные данные для входа в MyCalApp. Вы должны ввести свое имя пользователя и пароль на сайте HireMe123.
Затем HireMe123 используя ваш логин получить доступ к API MyCalApp, и затем сможет создавать события календаря с использованием ваших учетных данных.
Совместное использование учетных данных — это плохо!
Этот подход основывался на совместном использовании личных учетных данных пользователя из одного приложения с совершенно другим приложением, и это не очень хорошо.
Так как, HireMe123 поставил на карту защиты вашей учетной записи MyCalApp гораздо меньше. Если HireMe123 не защитит ваши учетные данные MyCalApp надлежащим образом, и они в конечном итоге будут украдены или взломаны, кто-то сможет написать несколько неприятных статей в блоге, но HireMe123 как бы останется в стороне.
HireMe123 также получает слишком большой доступ к MyCalApp от вашего имени. HireMe123 получает все те же привелегии, что и вы, потому что он использовал ваши учетные данные для получения этого доступа. Это означает, что HireMe123 может читать все ваши события календаря, редактировать их, изменять настройки и т. д.
SessionAuthentication
This authentication scheme uses Django’s default session backend for authentication. Session authentication is appropriate for AJAX clients that are running in the same session context as your website.
If successfully authenticated, provides the following credentials.
- will be a Django instance.
- will be .
Unauthenticated responses that are denied permission will result in an response.
If you’re using an AJAX style API with SessionAuthentication, you’ll need to make sure you include a valid CSRF token for any «unsafe» HTTP method calls, such as , , or requests. See the for more details.
Warning: Always use Django’s standard login view when creating login pages. This will ensure your login views are properly protected.
CSRF validation in REST framework works slightly differently to standard Django due to the need to support both session and non-session based authentication to the same views. This means that only authenticated requests require CSRF tokens, and anonymous requests may be sent without CSRF tokens. This behaviour is not suitable for login views, which should always have CSRF validation applied.
Выучить больше
Серия видеороликов Learn Identity в документах Auth0 — это лекционная часть нового учебного курса по найму для инженеров в Auth0, представленного главным архитектором Витторио Берточчи. Если вы хотите лично узнать, как это делается в Auth0, она абсолютно бесплатна и доступна для всех.
Спецификации OAuth 2.0 и OpenID Connect являются сложными, но как только вы ознакомитесь с терминологией и получите базовые знания об идентификации, они будут полезны, информативны и станут намного более удобочитаемыми. Почитать их можно здесь: The OAuth 2.0 Authorization Framework и OpenID Connect Specifications..
JWT.io — это ресурс о JSON Web Token, который предоставляет инструмент отладчика и каталог библиотек подписи/проверки JWT для различных технологий.
OpenID Connect Playground — это отладчик, который позволяет разработчикам шаг за шагом исследовать и тестировать вызовы и ответы .
Release History
Version | Date | Description |
---|---|---|
v0.4.11 | 2020-03-04 | Updated dependencies to latest versions and removed use of deprecated req.param |
v0.4.10 | 2018-02-27 | Updated dependencies to latest versions |
v0.4.9 | 2017-06-19 | Multiple API keys can be configured for various third parties |
v0.4.8 | 2017-05-16 | Support authDetail object in the response so cater for conditional access |
v0.4.7 | 2017-02-01 | Republished as github latest not up to date. |
v0.4.6 | 2016-10-25 | Fixed to check the authHeader before other sources of the key |
v0.4.5 | 2016-03-21 | Allow mobile apps to use apiKey instead of XSRF check |
v0.4.4 | 2015-09-28 | Clear token cookie on unauthorised (401) |
v0.4.3 | 2014-09-04 | Debug module |
v0.4.2 | 2014-09-02 | Location in 403 response |
v0.4.1 | 2014-08-22 | Resource check |
v0.3.3 | 2014-08-20 | Added promiscuous mode |
v0.3.2 | 2014-08-05 | Check looks for token in body,query, cookie |
v0.3.1 | 2014-07-18 | Can set original client request as an object from express req object |
v0.3.0 | 2014-07-16 | Added logout and checks for operations on resources |
v0.2.0 | 2014-06-13 | Added swapCode,keepAlive and angularJS XSRF check |
v0.1.0 | 2014-05-28 | Created |
(The MIT License)
Copyright (c) 2016 PC
Quickstart
Import the module and services in your module.
import{HttpClientModule}from'@angular/common/http';import{APP_INITIALIZER,NgModule}from'@angular/core';import{AuthModule,LogLevel,OidcConfigService}from'angular-auth-oidc-client';exportfunctionconfigureAuth(oidcConfigServiceOidcConfigService){return()=>oidcConfigService.withConfig({stsServer'https://offeringsolutions-sts.azurewebsites.net',redirectUrlwindow.location.origin,postLogoutRedirectUriwindow.location.origin,clientId'angularClient',scope'openid profile email',responseType'code',silentRenewtrue,silentRenewUrl`${window.location.origin}/silent-renew.html`,logLevelLogLevel.Debug,});}@NgModule({importsAuthModule.forRoot(),,providersOidcConfigService,{provideAPP_INITIALIZER,useFactoryconfigureAuth,depsOidcConfigService,multitrue,},,})exportclassAppModule{}
And call the method from your
import{Component,OnDestroy,OnInit}from'@angular/core';import{OidcClientNotification,OidcSecurityService,PublicConfiguration}from'angular-auth-oidc-client';import{Observable}from'rxjs';@Component({})exportclassAppComponentimplementsOnInit{constructor(publicoidcSecurityServiceOidcSecurityService){}ngOnInit(){this.oidcSecurityService.checkAuth().subscribe((auth)=>console.log('is authenticated',auth));}login(){this.oidcSecurityService.authorize();}logout(){this.oidcSecurityService.logoff();}}
Создание файла . htpasswd
Переходим к созданию файла с паролями . htpasswd, для этого воспользуемся утилитой htpasswd.exe. Работать с которой нужно через командную строку. Далее рассмотрены примеры работы с утилитой:
• Создать новый файл с паролями, назначить ему имя .htpasswd, задать шифрование паролей по алгоритму MD5 и добавить в него логин admin:
htpasswd -cm .htpasswd admin
-cm — ключи утилиты:
-с – указывает, что необходимо создать новый файл
-m –шифрует пароли по алгоритму MD5
.htpasswd – имя файла с паролями
admin – логин
Рис. 2. Создание нового файла с паролями, утилитой htpasswd.exe
• Добавить в уже существующий файл с паролями нового пользователя. Для этого нужно в команде указать один ключ –m, ключ –c, опустить.
htpasswd -m .htpasswd user
Рис. 3. Добавление в уже существующий файл с паролями нового пользователя, утилитой htpasswd.exe.
• Чтобы изменить пароль для существующего пользователя, используйте ту же команду, что и при добавлении.
htpasswd -m .htpasswd user
Рис 4. Изменение пароля для существующего пользователя, с помощью утилиты htpasswd.exe.
После создания файла с паролями, поместите его в директорию, путь к которой указан в директиве AuthUserFile файла .htaccess. (в нашем случае в папку CMS)
Надежность авторизации
Basic
Прежде всего логин и пароль пользователя хранятся на компьютере пользователя и передаются серверу (шаг 3) БЕЗ шифрования. То что мы видим в заголовке запроса
Authorization: Basic YXNtaXY6ZGRk
это всего лишь кодирование base64. Преобразовать набор символов в пару логин-пароль не составляет никакого труда, например так https://www.base64decode.org/
Далее Basic авторизация статична — пароль, единожды сохраненный Вашим браузером позволит Вам заходить в последующем в защищенную зону без прохождения авторизации до оконачания сеанса (закрытия браузера)
И, наконец, протокол Basic авторизации не предусматривает никаких ограничений на количество попыток авторизации.
Digest
Работа Digest авторизации чуть сложнее. Прежде всего, при первом сообщении клиенту о необходимости прохождения авторизации (шаг 2), сервер передает в заголовке ряд параметров
WWW-Authenticate: Digest realm="private", nonce="lz9uTMU8BQA=398ac33371c9922a84e12c06394493152781e575", algorithm=MD5, qop="auth"
realm — имя защищенной области (помните, мы акцентировали на ней внимание при настроке файла конфигурации?) Здесь значение этого параметра играет роль (в отличии от Basic авторизации) nonce — уникальный ключ, генерируемый сервером в момент отправки сообщения клиенту algorithm — название алгоритма (как правило, MD5)
Этой информации достаточно браузеру для того чтобы знать как нужно шифровать введенные пользователем логин и пароль перед отправкой на сервер
Пользователь вводит логин-пароль, браузер шифрует их и отправляет серверу для проверки следующую информацию (шаг 3)
Authorization: Digest username="admin", realm="private", nonce="bT2bUMU8BQA=c7efe86ce4147b1ada766fbcd96639c521855b45", uri="/digest/", algorithm=MD5, response="bf1ec1979946c684cbe834974be19dc9", qop=auth, nc=00000001, cnonce="896733f4c19f6c9d"
Здесь прежде всего нужно обратить внимание на параметр response. Это — контрольная сумма с которой будет сверяться сервер
Получив от клиента информацию, сервер берет из файла паролей (.htpasswd) для пользователя username и защищенной зоны realm правильное значение пароля, по известному алгоритму (см. ниже) вычисляет контрольную сумму и сравнивает ее с суммой, переданной в response. Если суммы не совпадают — сервер вновь предлагает пройти авторизацию
Алгоритм расчета контрольной суммы (response) одинаков для клиента и сервера. Достаточно понятно от описан здесь
Таким образом, главное отличие Digest-авторизация — шифрование пароля. Что, впрочем не до конца исключает уязвимость данного способа авторизации.
Proxy Configuration
If you have to configure client cert auth over a nginx proxy host, then use these steps. Steps for mailbox node should NOT to be done.
1. Make sure zimbraReverseProxyMailMode is set to «https» or «both».
To know current zimbraReverseProxyMailMode setting
zmprov gs {Proxy_servername} zimbraReverseProxyMailMode
To change to a required a mode.
zmprov ms {Proxy_servername} zimbraReverseProxyMailMode {Mode}
2. Set zimbraMailSSLProxyClientCertPort to a unique port. (e.g. 3443). It should not be set similar to zimbraReverseProxyMailSSLPort.
zmprov ms {Proxy_servername} zimbraMailSSLProxyClientCertPort 3443
zmprov ms {Proxy_servername} zimbraReverseProxyClientCertMode {NeedClientAuth}
OR
zmprov ms {Proxy_servername} zimbraReverseProxyClientCertMode {WantClientAuth}
4. Import the CA.crt to zimbraReverseProxyClientCertCA using libexec/zmclientcertmgr command. For a client authenticating itself to the server, the server must trust the CA who signed the client’s certificate. Therefore the server part (nginx) has to know the CA and the browser has to send the client cert to server and let server check its validity.
If using self signed certs, import the CA.crt file that is generated in «Preperation» section 1A. If using commercial certs, you need to import your CA’s root cert.
/opt/zimbra/libexec/zmclientcertmgr savecrt global
content=`cat /tmp/certs/CA.crt` zmprov -m -l -- mcf zimbraReverseProxyClientCertCA "$content"
5. Add nginx server’s IP address in zimbraReverseProxyAdminIPAddress. In this way, Nginx Lookup Handler will know the lookup request comes from a valid nginx. Otherwise, Nginx Lookup will always return «login failed», and nginx return «403 Forbidden error».
zmprov mcf +zimbraReverseProxyAdminIPAddress <nginx_ip>
You need to enter all zimbra proxy hosts IP addresses using above command.
6. Flush cache in all mailbox nodes.
zmprov fc -a config
7. Restart nginx service.
zmnginxctl restart
Overview
This tutorial will illustrate how to configure Basic Authentication on the Apache HttpClient 4.
If you want to dig deeper and learn other cool things you can do with the HttpClient – head on over to the main HttpClient tutorial.
2. Basic Authentication With the API
Let’s start with the standard way of configuring Basic Authentication on the HttpClient – via a CredentialsProvider:
As we can see, creating the client with a credentials provider to set it up with Basic Authentication is not difficult.
Now, to understand what HttpClient will actually do behind the scenes, we’ll need to look at the logs:
The entire Client-Server communication is now clear:
- the Client sends the HTTP Request with no credentials
- the Server sends back a challenge
- the Client negotiates and identifies the right authentication scheme
- the Client sends a second Request, this time with credentials
3. Preemptive Basic Authentication
Out of the box, the HttpClient doesn’t do preemptive authentication. Instead, this has to be an explicit decision made by the client.
First, we need to create the HttpContext – pre-populating it with an authentication cache with the right type of authentication scheme pre-selected. This will mean that the negotiation from the previous example is no longer necessary – Basic Authentication is already chosen:
Now we can use the client with the new context and send the pre-authentication request:
Let’s look at the logs:
Everything looks OK:
- the “Basic Authentication” scheme is pre-selected
- the Request is sent with the Authorization header
- the Server responds with a 200 OK
- Authentication succeeds
4. Basic Auth With Raw HTTP Headers
Preemptive Basic Authentication basically means pre-sending the Authorization header.
So, instead of going through the rather complex previous example to set it up, we can take control of this header and construct it by hand:
Let’s make sure this is working correctly:
So, even though there is no auth cache, Basic Authentication still works correctly and we receive 200 OK.
5. Conclusion
This article illustrated various ways to set up and use basic authentication with the Apache HttpClient 4.
As always, the code presented in this article is available over on Github. This is a Maven based project, so it should be easy to import and run as it is.
Store
Getter | Returns | Description | Example |
---|---|---|---|
pluginName | String | The plugin name/identifier. This value cannot be changed. | |
activeUser | The active user that is using the app. The user returned is never . | ||
activeUserToken | String | The active user auth token, obtained when a user has successfully authenticated. Returns if an auth session has not been successfully established (or the active user is not logged-in). | |
isAuthenticating | Boolean | Returns when the app is performing authentication. | |
isAuthorizing | Boolean | Returns when the app is performing authorization. | |
isFetchingUserInfo | Boolean | Returns when the app is fetching user information via the authenticator hook. |
All actions are Promises, but not all actions are asynchronous.
Name | Parameters | Returns | Description | Example |
---|---|---|---|---|
authorize | (none) | TBC | ||
loginUser | creds = | TBC | ||
logoutUser | (none) | TBC |
The following actions are available in the store, but are primarily utilized internally by the Vuestrap logic. Unless you are performing customized logic with the Client Auth Support store, you will not likely use these actions.
Name | Parameters | Returns | Description | Example |
---|---|---|---|---|
setActiveUser | (void) | TBC | ||
clearActiveUser | (none) | (void) | TBC | |
fetchUserInfo | (none) | TBC |
Basic аутентификация
При базовой аутентификации клиент вместе с запросом отправляет серверу логин и пароль. Эти данные отправляются в заголовке запроса Authorization в виде base64 кода:
Authorization: Basic base64_encode(username:password)
Так например, если логин и пароль у нас , нужно добавить такой заголовок:
Authorization: Basic YWRtaW46YWRtaW4=
Так как base64 очень просто раскодировать, такой метод совершенно небезопасен и может быть использован только для разработки или тестов.
Basic Авторизация в программе Postman
- Перейдите во вкладку ;
- Выберите метод аутентификации ;
- Укажите логин и пароль;
- Все! Отправляйте авторизованные запросы.
Basic Авторизация через WP HTTP API
$response = wp_remote_request( 'http://wptest.ru/wp-json/wp/v2/posts/113', ] ); if( 200 == wp_remote_retrieve_response_code( $response ) ) echo 'Пост удален!'; else echo 'Ошибка: Не удалось удалить пост';
Basic Авторизация через JavaScript
$.ajax({ url: 'http://wptest.ru/wp-json/wp/v2/posts/113', method: 'DELETE', crossDomain: true, beforeSend: function ( xhr ) { xhr.setRequestHeader( 'Authorization', 'Basic ' + Base64.encode( 'username:password' ) ); }, success: function( data, txtStatus, xhr ) { console.log( data ); console.log( xhr.status ); } });
Models
Model | Description |
---|---|
User | Represents the active user and auth status of the active web session. |
The data model encapsulates the state and values of the user that is actively using the app. The Vuestrap creates and manages this model internally, whenever authentication and authorization occurs.
Name | Type | Description |
---|---|---|
model | String | The name of the model type (i.e. ). |
is_anon | Boolean | Whether or not the user is acting as anonymous. |
is_logged_in | Boolean | Whether or not the user is logged-in. |
id | Number or String | The ID of the user. |
external_id | Number or String | An external (third-party) associated ID of the user. |
username | String | The username of the user. |
String | The email of the user. | |
first_name | String | The first name of the user. |
last_name | String | The last name of the user. |
display_name | String | The display name of the user. |
preferred_locale | String | The preferred locale of the user. |
avatar_url | String | The avatar URL for the user. |
avatar_thumb_url | String | A thumbnail version of the avatar URL for the user. |
roles | Array | An array of role names granted to the user. |
Name | Parameters | Returns | Description |
---|---|---|---|
login | (none) | (void) | A convenience method for setting the model to a logged-in state. |
logout | (none) | (void) | A convenience method for setting the model to a logged-out state. |
hasRole | roleName | Boolean | A convenience method for checking if the user has a specified role. |
getInfo | (none) | Object | Generates a light-weight info object describing the user. |
toSession | (none) | String | Generates a stringified version of the info object describing the user. |
serialize | (none) | String | Serializes the full set of user properties into a String, that is safe for HTTP transport. |
The always returns a model. When un-authenticated, the anonymized shape and state of the model instance will hold:
Name | Type | Value |
---|---|---|
model | String | |
is_anon | Boolean | |
is_logged_in | Boolean | |
id | Number | |
external_id | null | |
username | String | |
display_name | String | |
avatar_url | String | |
avatar_thumb_url | String |
Безопасность
На перечисленных недостатках сегодня реализованы различные успешные методы взлома пароля и получения доступа к защищенной зоне сайта. Наиболее распространенными являются подбор пароля и его взлом.
Подбор пароля основан на том, что basic и digest авторизация в чистом виде не контролируют количество неудачных попыток авторизации. Поэтому достаточно просто создать программу, автоматически генерирующую запросы доступа в защищенную с подставлением различных паролей (из заранее подготовленного словаря) до тех пор пока один из паролей не подойдет
Другой способ — взлом пароля реализуется в два этапа. Сначала необходимо получить информацию о логине-пароле пользователя (из данных сохраненных браузером клиента или перехваченного трафика). Затем из полученной информации извлекается пароль. Если для basic-авторизации это труда не составляет, то с digest-авторизацией сложнее. Но вполне осуществимо. Здесь применяется программное обеспечение использующее различные подходы:
- прямой подбор паролей из словаря — наименне эффективный метод но при удачно составленном словаре вполне действенный (см пример ниже)
- использование «радужных таблиц»
- метод «туннелирования»
- используя вычислительные мощности отдельных видов видеокарт
Release History
Version | Date | Description |
---|---|---|
v0.4.11 | 2020-03-04 | Updated dependencies to latest versions and removed use of deprecated req.param |
v0.4.10 | 2018-02-27 | Updated dependencies to latest versions |
v0.4.9 | 2017-06-19 | Multiple API keys can be configured for various third parties |
v0.4.8 | 2017-05-16 | Support authDetail object in the response so cater for conditional access |
v0.4.7 | 2017-02-01 | Republished as github latest not up to date. |
v0.4.6 | 2016-10-25 | Fixed to check the authHeader before other sources of the key |
v0.4.5 | 2016-03-21 | Allow mobile apps to use apiKey instead of XSRF check |
v0.4.4 | 2015-09-28 | Clear token cookie on unauthorised (401) |
v0.4.3 | 2014-09-04 | Debug module |
v0.4.2 | 2014-09-02 | Location in 403 response |
v0.4.1 | 2014-08-22 | Resource check |
v0.3.3 | 2014-08-20 | Added promiscuous mode |
v0.3.2 | 2014-08-05 | Check looks for token in body,query, cookie |
v0.3.1 | 2014-07-18 | Can set original client request as an object from express req object |
v0.3.0 | 2014-07-16 | Added logout and checks for operations on resources |
v0.2.0 | 2014-06-13 | Added swapCode,keepAlive and angularJS XSRF check |
v0.1.0 | 2014-05-28 | Created |
(The MIT License)
Copyright (c) 2016 PC
С этим читают
- Волшебный файл .htaccess
- Руководство по аутентификации в node.js без passport.js и сторонних сервисов
- Getting started with python requests — get requests
- Uri
- Аутентификация rest api с помощью spring security и mongodb
- Python string isupper islower upper lower functions example
- Вспомогательные классы для работы со строками в java
- Современные стандарты идентификации: oauth 2.0, openid connect, webauthn
- Аутентификация через «вконтакте»
- Basic ssh (putty) commands