C # PostAsync для Laravel Passport сообщает, что сервер авторизации не поддерживает гранты - PullRequest
0 голосов
/ 24 сентября 2018

Я пытаюсь запросить токен из Passport через C #, например:

StringContent content = new StringContent("form_params: [{'grant_type':'password', 'username': "+UserName.Text+",'password':"+Password.Password+ ",'client_id':4,'client_secret':'YAYLOOKATTHISNOTWORKING','scope':''}]", Encoding.UTF8, "application/x-www-form-urlencoded");
HttpResponseMessage response = await App.client.PostAsync("https://" + InterfaceAddress.Text+"/oauth/token", content);
response.EnsureSuccessStatusCode();    // Throw if not a success code.

Это всегда приводит к ошибке The authorization grant type is not supported by the authorization server..Клиент passpport был создан с --password.

1 Ответ

0 голосов
/ 28 сентября 2018

Тип носителя content говорит application/x-www-form-urlencoded, но фактическая строка содержимого больше похожа на JSON.

Перепроверьте, как вы отправляете контент, так как это может быть проблемой форматирования.

На основании документации API для запроса токена предоставления пароля , запрос токена предоставления пароля будет выглядетькак это

$http = new GuzzleHttp\Client;

$response = $http->post('http://your-app.com/oauth/token', [
    'form_params' => [
        'grant_type' => 'password',
        'client_id' => 'client-id',
        'client_secret' => 'client-secret',
        'username' => 'taylor@laravel.com',
        'password' => 'my-password',
        'scope' => '',
    ],
]);

Документация Guzzel

Отправка application/x-www-form-urlencoded запросов POST требует, чтобы вы указали поля POST в виде массива в запросе form_paramsпараметры.

$response = $client->request('POST', 'http://httpbin.org/post', [
    'form_params' => [
        'field_name' => 'abc',
        'other_field' => '123',
        'nested_field' => [
            'nested' => 'hello'
        ]
    ]
]);

Ниже показано, как сделать запрос токена предоставления пароля с помощью HttpClient и FormUrlEncodedContent

var url = "https://" + InterfaceAddress.Text + "/oauth/token";
string username = UserName.Text;
string password =  Password.Password;

var form_params = new Dictionary<string,string>(){
    {"grant_type", "password"},
    {"username", username},
    {"password", password},
    {"client_id","4"},
    {"client_secret", "YAYLOOKATTHISNOTWORKING"},
    {"scope", ""}
};
var content = new FormUrlEncodedContent(form_params);    
var response = await App.client.PostAsync(url, content);
response.EnsureSuccessStatusCode();    // Throw if not a success code.
...