Когда я использую поток секретной аутентификации клиента с конфиденциальным клиентом, как я могу аутентифицировать пользователя (того, который подключается как HTTP-клиент к моему веб-сайту или любой другой метод доступа к сети) и использовать делегированный доступ?
Я понимаю, как это сделать с публичным клиентом. Я также мог бы использовать общедоступный клиентский поток на этом сервере, но это не имело бы особого смысла, поскольку технически мой сервер должен быть конфиденциальным клиентом.
Минимальный рабочий пример (если "MY.\{-}"
заменен действительным набором секретного кода клиента, идентификатора клиента и идентификатора клиента):
package main
import (
"context"
"fmt"
"github.com/AzureAD/microsoft-authentication-library-for-go/apps/confidential"
)
func main() {
cred, err := confidential.NewCredFromSecret("MY_CLIENT_SECRET")
if err != nil {
panic(err)
}
confidential_client, err := confidential.New(
"https://login.microsoftonline.com/"+"MY_TENANT_ID",
"MY_CLIENT_ID",
cred,
)
if err != nil {
panic(err)
}
result, err := confidential_client.AcquireTokenByCredential(
context.Background(),
[]string{"User.Read"},
)
if err != nil {
panic(err)
}
fmt.Println(result)
}
Результаты:
{
"error": "invalid_scope",
"error_description": "AADSTS1002012: The provided value for scope User.
Read openid offline_access profile is not valid. Client credential flows must have a scope value with /.default suffixed to the resource identifier (application ID URI). Trace ID: REDACTED Correlation ID: REDACTED Timestamp: 2024-08-16 03:46:42Z",
"error_codes": [1002012],
"timestamp": "2024-08-16 03:46:42Z",
"trace_id": "REDACTED",
"correlation_id":"REDACTED"
}
Для конфиденциального клиента вы не можете использовать делегированный доступ.
@Rukmini Я в замешательстве, потому что Learn.microsoft.com/en-us/entra/identity-platform/…, кажется, предполагает, что конфиденциальные клиенты могут: (1) приобретать токены для самого приложения, (2) использовать Поток OBO (что для меня не имеет смысла, поскольку у меня нет JS или какого-либо подобного интерфейса, и я не собираюсь вызывать API, мне просто нужно аутентифицировать пользователей) и (3) получить токены с использованием потока кода авторизации.
@Rukmini Я думал, что простая аутентификация пользователей с помощью MSAL из веб-приложения требует делегированного доступа.
Какую область вы хотите передать? и какой API вы хотите вызвать?
@Rukmini Единственная область, которая мне нужна, - это User.Read, а именно для чтения отображаемого имени пользователя, адреса электронной почты и какого-то уникального идентификатора пользователя (подойдет UUID, который не меняется).
Да, это сработает, но должны быть возможности для конфиденциального клиента https://graph.microsoft.com/.default
Конфиденциальный клиент работает только с разрешениями API типа приложения, поэтому вам необходимо предоставить разрешение API типа приложения User.Read.All, поскольку User.Read делегируется.
Чтобы быть более ясным, если задействовано взаимодействие с пользователем и если вы хотите получить сведения о вошедшем в систему пользователе, вы не можете использовать конфиденциальный клиентский поток. Вам необходимо использовать поток кода авторизации с разрешением User.Read.
Понятно, полагаю, я просто буду использовать публичный клиентский поток (поскольку получить User.Read.All у меня невозможно из-за политик организации). Это заставляет меня задуматься, как работает github.com/rayluo/identity...
Извините, всегда ли поток кода авторизации включает общедоступный клиент? И наоборот, можно ли ограничить использование потока кода авторизации моей регистрации клиентом, аутентифицированным с помощью секретного кода клиента?
Никаких проблем с общедоступным потоком клиентов не возникнет.
Могу ли я опубликовать ответ?
Пожалуйста... спасибо!
@NaveenSharma Я сделаю это, если это действительно то решение, которое я получу, поскольку я экспериментирую с использованием OpenID Connect. Хотя теперь я понимаю концепцию принятия ответов. Спасибо!
Обратите внимание: Конфиденциальный клиент работает только с разрешениями API типа приложения и не требует взаимодействия с пользователем.
Например, я попытался сгенерировать токен через почтальона и получил ту же ошибку, что и вы:
https://login.microsoftonline.com/TenantID/oauth2/v2.0/token
client_id:ClientID
client_secret:ClientSecret
scope↵:https://graph.microsoft.com/.default
grant_type:client_credentials
Ошибка «Указанное значение для области User.Read недопустимо. Потоки учетных данных клиента должны иметь значение области с суффиксом /.default к идентификатору ресурса (URI идентификатора приложения)» обычно возникает, если область при использовании конфиденциального клиента не имеет суффикса. по умолчанию. Чтобы устранить ошибку, используйте https://graph.microsoft.com/.default
Конфиденциальный клиент не подходит для вашего сценария, поскольку вы хотите передать область как User.Read
и не хотите передавать секрет клиента, вы можете использовать общедоступный поток клиентов.
Если требуется взаимодействие с пользователем и вы хотите получить сведения о вошедшем в систему пользователе, вам необходимо использовать любой интерактивный поток пользователя.
Это предполагает предоставление делегированных разрешений API.
А затем вызовите конечную точку https://graph.microsoft.com/v1.0/me
, чтобы получить данные вошедшего пользователя.
Изначально я не был уверен, что использование общедоступного клиентского потока уместно, поскольку я хочу, чтобы серверная часть моего веб-приложения могла использовать эту веб-регистрацию. Теперь, когда я об этом думаю, установка правильного URI перенаправления должна смягчить эту проблему.
Да, вам нужно установить URI перенаправления
Объем должен быть
https://graph.microsoft.com/.default
дляAcquireTokenByCredential
потока. Дайте мне знать, если это сработает