Вызов API Microsoft Graph для токена выдает ошибку «AADSTS900144: тело запроса должно содержать следующий параметр:« grant_type » - PullRequest
1 голос
/ 01 апреля 2020

Я звоню по URL API Graph

https://login.microsoftonline.com/{tenantId}/oauth2/v2.0/token

, чтобы получить токен доступа, но я получаю следующий ответ.

{
    "error": "invalid_request",
    "error_description": "AADSTS900144: The request body must contain the following parameter: 'grant_type'.\r\nTrace ID: 5ff6b053-9011-4397-89ff-fdb6f31e4600\r\nCorrelation ID: 22509847-199d-4bd8-a083-b29d8bbf3139\r\nTimestamp: 2020-04-01 11:14:00Z",
    "error_codes": [
        900144
    ],
    "timestamp": "2020-04-01 11:14:00Z",
    "trace_id": "5ff6b053-9011-4397-89ff-fdb6f31e4600",
    "correlation_id": "22509847-199d-4bd8-a083-b29d8bbf3139",
    "error_uri": "https://login.microsoftonline.com/error?code=900144"
}

У меня есть активный tenantid, у меня есть приложение зарегистрировано, и у меня есть активный пользователь для вышеуказанного приложения, скажем user@tenant.onmicrosoft.com; этот пользователь имеет ВСЕ роли (глобальный администратор).

Ниже приведен запрос и ответ почтальона. PostmanSnap

Также я дал разрешение API, как предложено в https://docs.microsoft.com/en-us/graph/api/group-post-members?view=graph-rest-1.0&tabs=http

1 Ответ

0 голосов
/ 01 апреля 2020

Проблема: Я успешно воспроизвел вашу ошибку. Как вы видите ниже:

enter image description here

Решение:

Вы пытаетесь в Неправильный путь. Вы должны отправить требуемый параметр в form-data почтальону с key-value pairs, как показано ниже в формате:

grant_type:client_credentials
client_id:b6695c7be_YourClient_Id_e6921e61f659
client_secret:Vxf1SluKbgu4PF0Nf_Your_Secret_Yp8ns4sc=
scope:https://graph.microsoft.com/.default

enter image description here

Фрагмент кода:

  //Token Request End Point
    string tokenUrl = $"https://login.microsoftonline.com/YourTenant.onmicrosoft.com/oauth2/v2.0/token";
    var tokenRequest = new HttpRequestMessage(HttpMethod.Post, tokenUrl);

    //I am Using client_credentials as It is mostly recommended
    tokenRequest.Content = new FormUrlEncodedContent(new Dictionary<string, string>
    {
        ["grant_type"] = "client_credentials",
        ["client_id"] = "b6695c7be_YourClient_Id_e6921e61f659",
        ["client_secret"] = "Vxf1SluKbgu4PF0Nf_Your_Secret_Yp8ns4sc=",
        ["scope"] = "https://graph.microsoft.com/.default" 
    });

    dynamic json;
    AccessTokenClass results = new AccessTokenClass();
    HttpClient client = new HttpClient();

    var tokenResponse = await client.SendAsync(tokenRequest);

    json = await tokenResponse.Content.ReadAsStringAsync();
    results = JsonConvert.DeserializeObject<AccessTokenClass>(json);

Используемый класс:

public class AccessTokenClass
   {
        public string token_type { get; set; }
        public string expires_in { get; set; }
        public string resource { get; set; }
        public string access_token { get; set; }
   }

Вы можете сослаться на Официальный документ

Надеюсь, что помог бы. Если у вас все еще есть проблемы, не стесняйтесь поделиться.

...