Можно ли использовать делегированный доступ с конфиденциальным клиентом в библиотеке аутентификации Microsoft?

Когда я использую поток секретной аутентификации клиента с конфиденциальным клиентом, как я могу аутентифицировать пользователя (того, который подключается как 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 отсутствует наследование классов, вместо него используется композиция и интерфейсы.


1
66
1

Ответ:

Решено

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