Заметка
Доступ к этой странице требует авторизации. Вы можете попробовать войти в систему или изменить каталог.
Доступ к этой странице требует авторизации. Вы можете попробовать сменить директорию.
Это важно
Начиная с 1 мая 2025 г. Azure AD B2C больше не будет доступен для приобретения для новых клиентов. Дополнительные сведения см. в разделе "Вопросы и ответы".
Вы можете использовать код авторизации OAuth 2.0 в приложениях, установленных на устройстве, для получения доступа к защищенным ресурсам, таким как веб-API. Используя реализацию OAuth 2.0 в Azure Active Directory B2C (Azure AD B2C), вы можете добавить процессы регистрации и входа, а также другие задачи управления идентичностью в ваши одноэкранные, мобильные и десктопные приложения. В этой статье описано, как отправлять и получать HTTP-сообщения без использования библиотек с открытым кодом. Эта статья является независимой от языка. По возможности рекомендуется использовать поддерживаемые библиотеки проверки подлинности Майкрософт (MSAL). Ознакомьтесь с примерами приложений, использующих MSAL.
Описание потока кода авторизации OAuth 2.0 см. в разделе 4.1 спецификации OAuth 2.0. Его можно использовать для проверки подлинности и авторизации в большинстве типов приложений, включая веб-приложения, одностраничные приложения и встроенные приложения. Поток кода авторизации OAuth 2.0 можно использовать для безопасного получения маркеров доступа и маркеров обновления для приложений, которые можно использовать для доступа к ресурсам, защищенным сервером авторизации. Маркер обновления позволяет клиенту получать новые маркеры доступа (и обновлять) после истечения срока действия маркера доступа, как правило, через один час.
В этой статье рассматривается поток кода авторизации для общедоступных клиентов OAuth 2.0. Общедоступный клиент — это любое клиентское приложение, которое не может быть доверенным для безопасного поддержания целостности секретного пароля. Это включает одностраничные приложения, мобильные приложения, классические приложения и практически любое приложение, которое не выполняется на сервере.
Примечание.
Чтобы добавить управление удостоверениями в веб-приложение с помощью Azure AD B2C, используйте OpenID Connect вместо OAuth 2.0.
Azure AD B2C расширяет стандартные потоки OAuth 2.0 для выполнения более простой проверки подлинности и авторизации. Он представляет поток пользователя. С помощью потоков пользователей можно использовать OAuth 2.0 для добавления пользовательского опыта в приложение, таких как регистрация, вход в систему и управление профилем. Поставщики удостоверений, использующие протокол OAuth 2.0, включают Amazon, Microsoft Entra ID, Facebook, GitHub, Google и LinkedIn.
Чтобы попробовать HTTP-запросы в этой статье, выполните следующие действия.
- Замените
{tenant}именем клиента Azure AD B2C. - Замените
00001111-aaaa-2222-bbbb-3333cccc4444идентификатором приложения, которое вы ранее зарегистрировали в клиенте Azure AD B2C. - Замените
{policy}именем политики, созданной в арендаторе, напримерb2c_1_sign_in.
Настройка URI перенаправления, необходимая для одностраничных приложений
Поток кода авторизации для одностраничных приложений требует дополнительной настройки. Следуйте инструкциям по созданию одностраничного приложения , чтобы правильно пометить URI перенаправления как включенный для CORS. Чтобы обновить существующий URI перенаправления для включения CORS, можно щелкнуть запрос на миграцию в разделе "Web" вкладки регистрация приложенияАутентификация. Кроме того, можно открыть редактор манифеста регистрации приложений и задать поле type для URI перенаправления spa в разделе replyUrlsWithType.
Тип spa перенаправления обратно совместим с неявным потоком. Приложения, в настоящее время использующие неявный поток для получения токенов, могут переноситься в spa тип URI перенаправления без проблем и продолжать использовать неявный поток.
1. Получение кода авторизации
Поток кода авторизации начинается с того, что клиент направляет пользователя к конечной точке /authorize . Это интерактивная часть потока, где пользователь принимает меры. В этом запросе клиент указывает в параметре scope разрешения, которые ему необходимо получить от пользователя. В следующих примерах (с разрывами строк для удобства чтения) показано, как получить код авторизации. Если вы тестируете этот HTTP-запрос GET, используйте браузер.
GET https://{tenant}.b2clogin.com/{tenant}.onmicrosoft.com/{policy}/oauth2/v2.0/authorize?
client_id=00001111-aaaa-2222-bbbb-3333cccc4444
&response_type=code
&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob
&response_mode=query
&scope=00001111-aaaa-2222-bbbb-3333cccc4444%20offline_access%20https://{tenant-name}/{app-id-uri}/{scope}
&state=arbitrary_data_you_can_receive_in_the_response
&code_challenge=YTFjNjI1OWYzMzA3MTI4ZDY2Njg5M2RkNmVjNDE5YmEyZGRhOGYyM2IzNjdmZWFhMTQ1ODg3NDcxY2Nl
&code_challenge_method=S256
| Параметр | Обязательно? | Описание |
|---|---|---|
| {арендатор} | Обязательно | Имя клиента Azure AD B2C |
| {политика} | Обязательно | Поток пользователя, который будет выполняться. Укажите имя потока пользователя, созданного в клиенте Azure AD B2C. Например: b2c_1_sign_in, b2c_1_sign_up, или b2c_1_edit_profile. |
| идентификатор клиента | Обязательно | Идентификатор приложения, назначенный приложению на портале Azure. |
| тип_ответа | Обязательно | Тип ответа, который должен включать code, необходим для потока кода авторизации. Маркер идентификатора можно получить, если он включен в тип ответа, например code+id_token, и в этом случае область должна содержать openid. |
| redirect_uri (URI перенаправления) | Обязательно | URI перенаправления вашего приложения, куда отправляются и принимаются ответы на запросы аутентификации. Он должен точно соответствовать одному из URI перенаправления, зарегистрированных на портале, за исключением того, что он должен быть закодирован URL-адресом. |
| охват | Обязательно | Список областей, разделённый пробелами. Область openid указывает разрешение на вход пользователя и получение данных о пользователе в виде маркеров идентификатора. Область offline_access является необязательной для веб-приложений. Оно указывает, что приложению требуется маркер обновления для расширенного доступа к ресурсам. Идентификатор клиента указывает, что выданный маркер предназначен для использования зарегистрированным клиентом Azure AD B2C.
https://{tenant-name}/{app-id-uri}/{scope} обозначает разрешение на доступ к защищенным ресурсам, таким как веб-API. Дополнительные сведения см. в разделе "Запрос токена доступа". |
| режим_ответа | Рекомендуется | Метод, используемый для отправки полученного кода авторизации в приложение. Это может быть query, form_postили fragment. |
| государство | Рекомендуется | Значение, включенное в запрос, которое может быть строкой любого содержимого, которое вы хотите использовать. Как правило, используется случайно созданное уникальное значение, чтобы предотвратить атаки на подделку межсайтовых запросов. Состояние также используется для кодирования сведений о состоянии пользователя в приложении перед выполнением запроса проверки подлинности. Например, страница, на которой находился пользователь, или выполняемый поток пользователя. |
| подсказка | Необязательно | Тип требуемого взаимодействия с пользователем. В настоящее время единственным допустимым значением является loginто, что заставляет пользователя вводить свои учетные данные в этом запросе. Единый вход не сработает. |
| кодовое_задание | рекомендованный/обязательный | Используется для защиты кода авторизации с помощью ключа проверки подлинности для Exchange (PKCE). Является обязательным, если указан параметр code_challenge_method. Чтобы создать code_verifier и code_challenge, необходимо добавить логику в ваше приложение. Это URL-кодированный в Base64 хэш SHA256 от code_challenge. Вы храните code_verifier в вашем приложении для последующего использования и отправляете code_challenge вместе с запросом на авторизацию. Дополнительные сведения см. в PKCE RFC. Теперь это рекомендуется для всех типов приложений — собственных приложений, spAs и конфиденциальных клиентов, таких как веб-приложения. |
code_challenge_method |
рекомендованный/обязательный | Метод, используемый для кодирования code_verifier в параметре code_challenge.
Это должно бытьS256, но спецификация позволяет использоватьplain, если по какой-то причине клиент не может поддерживать SHA256. Если исключить code_challenge_method, но при этом все равно включить code_challenge, тогда code_challenge считается простым текстом. Платформа удостоверений Майкрософт поддерживает как plain, так и S256. Дополнительные сведения см. в PKCE RFC. Это необходимо для одностраничных приложений с помощью потока кода авторизации. |
| подсказка для входа | нет | Можно использовать для предварительного заполнения поля имени входа на странице входа. Дополнительные сведения см. в статье о предварительном заполнении имени входа. |
| подсказка_домена | нет | Предоставляет подсказку Azure AD B2C о социальном провайдере удостоверений, который следует использовать для входа в систему. Если указано корректное значение, пользователь переходит прямо на страницу входа поставщика удостоверений. Для получения дополнительных сведений см. Перенаправление входа к социальному провайдеру. |
| Пользовательские параметры | нет | Настраиваемые параметры, которые можно использовать с настраиваемыми политиками. Например, динамический URI пользовательского содержимого страницы или сопоставители утверждений с ключом-значением. |
На этом этапе пользователю предлагается завершить рабочий процесс потока пользователя. Это может включать ввод имени пользователя и пароля, вход с помощью социального удостоверения, регистрацию в каталоге или любое другое количество шагов. Действия пользователей зависят от того, как определен поток пользователя.
После того как пользователь завершит поток, Microsoft Entra ID отправит ответ вашему приложению по тому значению, которое вы использовали для redirect_uri. Он использует метод, указанный в параметре response_mode . Ответ точно совпадает с каждым из сценариев действий пользователя, независимо от выполняемого потока пользователя.
Успешный ответ, который использует response_mode=query, выглядит следующим образом:
GET urn:ietf:wg:oauth:2.0:oob?
code=AwABAAAAvPM1KaPlrEqdFSBzjqfTGBCmLdgfSTLEMPGYuNHSUYBrq... // the authorization_code, truncated
&state=arbitrary_data_you_can_receive_in_the_response // the value provided in the request
| Параметр | Описание |
|---|---|
| код | Запрашиваемый приложением код авторизации. Приложение может использовать код авторизации для запроса токена доступа для целевого ресурса. Коды авторизации являются короткими. Обычно они истекают через примерно 10 минут. |
| государство | См. полное описание таблицы в предыдущем разделе. Если запрос содержит параметр state, то в ответе должно отображаться то же значение. Приложение должно убедиться, что state значения в запросе и ответе идентичны. |
Ответы об ошибках также могут быть отправлены на URI перенаправления, чтобы приложение могло обработать их надлежащим образом.
GET urn:ietf:wg:oauth:2.0:oob?
error=access_denied
&error_description=The+user+has+cancelled+entering+self-asserted+information
&state=arbitrary_data_you_can_receive_in_the_response
| Параметр | Описание |
|---|---|
| ошибка | Строка кода ошибки, которую можно использовать для классификации типов возникающих ошибок. Можно также использовать строку для реагирования на ошибки. |
| описание ошибки | Конкретное сообщение об ошибке, с помощью которого можно определить первопричину возникновения ошибки аутентификации. |
| государство | Полный описание см. в предыдущей таблице. Если запрос содержит параметр state, то в ответе должно отображаться то же значение. Приложение должно убедиться, что state значения в запросе и ответе идентичны. |
2. Получите ключ доступа
Теперь, когда вы приобрели код авторизации, вы можете обменять code на маркер к целевому ресурсу, отправив запрос POST в конечную точку /token. В Azure AD B2C можно запросить маркеры доступа для других API как обычно, указав их области в запросе.
Вы также можете запросить маркер доступа для собственного внутреннего веб-API приложения, используя идентификатор клиента приложения в качестве запрошенной области (что приведет к маркеру доступа с таким идентификатором клиента в качестве аудитории):
POST https://{tenant}.b2clogin.com/{tenant}.onmicrosoft.com/{policy}/oauth2/v2.0/token HTTP/1.1
Content-Type: application/x-www-form-urlencoded
grant_type=authorization_code
&client_id=00001111-aaaa-2222-bbbb-3333cccc4444
&scope=00001111-aaaa-2222-bbbb-3333cccc4444 offline_access
&code=AwABAAAAvPM1KaPlrEqdFSBzjqfTGBCmLdgfSTLEMPGYuNHSUYBrq...
&redirect_uri=urn:ietf:wg:oauth:2.0:oob
&code_verifier=ThisIsntRandomButItNeedsToBe43CharactersLong
| Параметр | Обязательно? | Описание |
|---|---|---|
| {арендатор} | Обязательно | Имя клиента Azure AD B2C |
| {политика} | Обязательно | Поток пользователя, используемый для получения кода авторизации. В этом запросе нельзя использовать другой поток пользователя. |
| идентификатор клиента | Обязательно | Идентификатор приложения, назначенный приложению на портале Azure. |
| секрет_клиента | Да, в веб-приложениях | Секрет приложения, созданный на портале Azure. Секреты клиента используются в этом потоке для сценариев веб-приложения, где клиент может безопасно хранить секрет клиента. В сценариях нативных приложений (общедоступных клиентов) секреты клиента не могут быть безопасно сохранены и поэтому не используются в этом вызове. Если вы используете секрет клиента, измените его периодически. |
| тип предоставления | Обязательно | Тип гранта. Для потока авторизационного кода тип выдачи должен быть authorization_code. |
| охват | Рекомендуется | Список областей, разделённый пробелами. Одно значение области одновременно указывает Azure AD B2C на оба запрошенных разрешения. Использование идентификатора клиента в качестве области указывает, что приложению требуется токен доступа, который можно использовать в вашей собственной службе или веб-API, представленной тем же идентификатором клиента. Область offline_access указывает, что приложению требуется маркер обновления для долгосрочного доступа к ресурсам. Вы также можете использовать область openid для запроса токена идентификатора из Azure AD B2C. |
| код | Обязательно | Код авторизации, который вы получили с конечной точки /authorize. |
| redirect_uri (URI перенаправления) | Обязательно | URI перенаправления приложения, в котором вы получили код авторизации. |
| проверка_кода | рекомендуется | То же code_verifier, что используется для получения кода авторизации. Является обязательным, если в запросе на код авторизации использовался PKCE. Дополнительные сведения см. в PKCE RFC. |
Если вы тестируете этот HTTP-запрос POST, можно использовать любой HTTP-клиент, например Microsoft PowerShell.
Успешный ответ токена выглядит следующим образом:
{
"not_before": "1442340812",
"token_type": "Bearer",
"access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Ik5HVEZ2ZEstZnl0aEV1Q...",
"scope": "00001111-aaaa-2222-bbbb-3333cccc4444 offline_access",
"expires_in": "3600",
"refresh_token": "AAQfQmvuDy8WtUv-sd0TBwWVQs1rC-Lfxa_NDkLqpg50Cxp5Dxj0VPF1mx2Z...",
}
| Параметр | Описание |
|---|---|
| не ранее | Время, в течение которого маркер считается допустимым в эпоху. |
| тип токена | Значение типа токена. Единственный тип, поддерживаемый Microsoft Entra ID, — это Bearer. |
| маркер доступа (access_token) | Подписанный веб-токен JSON (JWT), запрошенный вами. |
| охват | Области, на которые распространяется действие маркера. Вы также можете использовать области для кэширования токенов для последующего использования. |
| срок действия истечет через | Время, в течение которого токен действителен (в секундах). |
| рефреш_токен | Токен обновления OAuth 2.0. Приложение может использовать этот маркер для получения дополнительных маркеров после истечения срока действия текущего маркера. Токены обновления имеют длительный срок действия. Их можно использовать для хранения доступа к ресурсам в течение длительного периода времени. Дополнительные сведения см. в справочнике по токену Azure AD B2C. |
Ответы на ошибки выглядят следующим образом:
{
"error": "access_denied",
"error_description": "The user revoked access to the app.",
}
| Параметр | Описание |
|---|---|
| ошибка | Строка кода ошибки, которую можно использовать для классификации типов возникающих ошибок. Можно также использовать строку для реагирования на ошибки. |
| описание ошибки | Конкретное сообщение об ошибке, с помощью которого можно определить первопричину возникновения ошибки аутентификации. |
3. Используйте маркер
Теперь, когда вы успешно приобрели маркер доступа, вы можете использовать маркер в запросах к внутренним веб-API, включив его в Authorization заголовок:
GET /tasks
Host: mytaskwebapi.com
Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Ik5HVEZ2ZEstZnl0aEV1Q...
4. Обновление токена
Токены доступа и идентификационные токены являются кратковременными. После истечения срока их действия необходимо обновить, чтобы продолжить доступ к ресурсам. При обновлении маркера доступа Azure AD B2C возвращает новый маркер. Обновленный маркер доступа будет иметь обновленные значения утверждений: nbf (не раньше), iat (время выдачи) и exp (срок действия). Все остальные значения параметров совпадают с первоначально выданным токеном доступа.
Чтобы обновить токен, отправьте другой запрос POST в конечную точку /token. На этот раз укажите refresh_token вместо code:
POST https://{tenant}.b2clogin.com/{tenant}.onmicrosoft.com/{policy}/oauth2/v2.0/token HTTP/1.1
Content-Type: application/x-www-form-urlencoded
grant_type=refresh_token
&client_id=00001111-aaaa-2222-bbbb-3333cccc4444
&scope=00001111-aaaa-2222-bbbb-3333cccc4444 offline_access
&refresh_token=AwABAAAAvPM1KaPlrEqdFSBzjqfTGBCmLdgfSTLEMPGYuNHSUYBrq...
&redirect_uri=urn:ietf:wg:oauth:2.0:oob
| Параметр | Обязательно? | Описание |
|---|---|---|
| {арендатор} | Обязательно | Имя клиента Azure AD B2C |
| {политика} | Обязательно | Пользовательский поток, использованный для получения основного токена обновления. В этом запросе нельзя использовать другой поток пользователя. |
| идентификатор клиента | Обязательно | Идентификатор приложения, назначенный приложению на портале Azure. |
| секрет_клиента | Да, в веб-приложениях | Секрет приложения, созданный на портале Azure. Секреты клиента используются в этом потоке для сценариев веб-приложения, где клиент может безопасно хранить секрет клиента. В сценариях нативных приложений (общедоступных клиентов) секреты клиента не могут быть безопасно сохранены и поэтому не используются в этом вызове. Если вы используете секрет клиента, измените его периодически. |
| тип предоставления | Обязательно | Тип гранта. Для этого этапа потока кода авторизации тип предоставления должен быть refresh_token. |
| охват | Рекомендуется | Список областей, разделённый пробелами. Одно значение области указывает Microsoft Entra ID все запрашиваемые разрешения. Использование идентификатора клиента в качестве области указывает, что приложению требуется токен доступа, который можно использовать в вашей собственной службе или веб-API, представленной тем же идентификатором клиента. Область offline_access указывает, что приложению требуется маркер обновления для долгосрочного доступа к ресурсам. Вы также можете использовать область openid для запроса токена идентификатора из Azure AD B2C. |
| redirect_uri (URI перенаправления) | Необязательно | URI перенаправления приложения, в котором вы получили код авторизации. |
| рефреш_токен | Обязательно | Исходный токен обновления, полученный во второй части потока. |
Успешный ответ токена выглядит следующим образом:
{
"not_before": "1442340812",
"token_type": "Bearer",
"access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiIsIng1dCI6Ik5HVEZ2ZEstZnl0aEV1Q...",
"scope": "00001111-aaaa-2222-bbbb-3333cccc4444 offline_access",
"expires_in": "3600",
"refresh_token": "AAQfQmvuDy8WtUv-sd0TBwWVQs1rC-Lfxa_NDkLqpg50Cxp5Dxj0VPF1mx2Z...",
}
| Параметр | Описание |
|---|---|
| не ранее | Время, в течение которого маркер считается допустимым в эпоху. |
| тип токена | Значение типа токена. Единственный тип, поддерживаемый Microsoft Entra ID, — это Bearer. |
| маркер доступа (access_token) | Подписанный JWT, запрошенный вами. |
| охват | Области, на которые распространяется действие маркера. Вы также можете использовать области действия для кэширования токенов для последующего использования. |
| срок действия истечет через | Время, в течение которого токен действителен (в секундах). |
| рефреш_токен | Токен обновления OAuth 2.0. Приложение может использовать этот маркер для получения дополнительных маркеров после истечения срока действия текущего маркера. Маркер обновления являются долговечными и могут использоваться для сохранения доступа к ресурсам в течение продолжительного периода времени. Дополнительные сведения см. в справочнике по токену Azure AD B2C. |
Ответы на ошибки выглядят следующим образом:
{
"error": "access_denied",
"error_description": "The user revoked access to the app.",
}
| Параметр | Описание |
|---|---|
| ошибка | Строка кода ошибки, которую можно использовать для классификации типов ошибок, возникающих. Можно также использовать строку для реагирования на ошибки. |
| описание ошибки | Конкретное сообщение об ошибке, с помощью которого можно определить первопричину возникновения ошибки аутентификации. |
Использование собственного каталога Azure AD B2C
Чтобы попробовать эти запросы самостоятельно, выполните следующие действия. Замените примеры значений, которые мы использовали в этой статье собственными значениями.
- Создайте каталог Azure AD B2C. Используйте имя каталога в запросах.
- Создайте приложение для получения идентификатора приложения и URI перенаправления. Включите собственный клиент в приложение.
- Создайте потоки пользователей , чтобы получить имена потоков пользователей.