Когда я использую поток секретной аутентификации клиента с конфиденциальным клиентом, как я могу аутентифицировать пользователя (того, который подключается как 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"
}
🤔 А знаете ли вы, что...
В Go отсутствует наследование классов, вместо него используется композиция и интерфейсы.
Обратите внимание: Конфиденциальный клиент работает только с разрешениями 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
, чтобы получить данные вошедшего пользователя.