oauth2 код проверки подлинности c # не работает - PullRequest
1 голос
/ 11 июня 2019

Я пытаюсь использовать oauth2 API, используя код авторизации. На первом этапе я получил аутентификацию, указав идентификатор клиента и секрет, а теперь на втором этапе мне нужен токен доступа с использованием этого кода авторизации. Я попробовал ниже C # код

var client1 = new RestClient("https://ant.aliceblueonline.com/oauth2/token");
var request1 = new RestRequest(Method.POST);
request1.AddHeader("Content-Type", "application/x-www-form-urlencoded");
request1.AddParameter("code", "xxxxxxxxxxxxxxxxx");
request1.AddParameter("grant_type", "authorization_code");
request1.AddParameter("redirect_uri", "https://ant.aliceblueonline.com/plugin/callback");
request1.AddParameter("client_id", "MM01418");
request1.AddParameter("client_secret", "xxxxxxxxxxxxxx");
IRestResponse response = client1.Execute(request1);

В ответ я получаю

Клиент OAuth 2.0 поддерживает метод аутентификации клиента "client_secret_basic", но запрошен метод "client_secret_post". Вы должны настроить значение «token_endpoint_auth_method» клиента OAuth 2.0 для принятия «client_secret_post

»

Много пытался, но не смог решить.

1 Ответ

3 голосов
/ 23 июня 2019

Прежде всего, когда вы работаете с C #, я бы рекомендовал вам использовать IdentityModel для взаимодействия с любым сервером авторизации OAuth2 или провайдером OpenId Connect.

Давайте начнем с определения клиента : клиент - это приложение, которому разрешено запрашивать токены доступа от имени пользователя. В вашем примере ваш сервер, на котором запущен указанный вами код, является клиентом.

Чтобы использовать конечную точку token для запроса нового access_token, клиент должен сначала подтвердить свою личность, предоставив client_id и client_secret (например, имя пользователя и пароль для клиентов) .

Существует два метода для предоставления учетных данных этого клиента, из IdentityServer4 документации о секретах :

Аутентификация с использованием общего секрета

Вы можете отправить клиентскую комбинацию идентификатор / секрет как часть тела POST:

POST /connect/token
client_id=client1& client_secret=secret& ...

.. или в качестве основного заголовка аутентификации:

POST /connect/token
Authorization: Basic xxxxx

В этом случае в ответе об ошибке говорится, что разрешен только один из этих методов, а именно Заголовок аутентификации

Таким образом, вместо того, чтобы передавать client_id и client_secret вдоль тела вашего запроса:

request1.AddParameter("client_id", "MM01418");
request1.AddParameter("client_secret", "xxxxxxxxxxxxxx");

вам нужно объединить client_id и client_secret с двоеточием в качестве разделителя, например "MM01418: xxxxxxxxxxxxxxxx", и применить кодировку base64. Затем добавьте его в свой запрос в качестве заголовка формы Authorization: Basic TU0wMTQxODp4eHh4eHh4eHh4eHh4eHh4. Вы можете сделать это в C #, используя следующий код:

var credentials = string.Format("{0}:{1}", clientId, clientSecret);
var headerValue = Convert.ToBase64String(Encoding.UTF8.GetBytes(credentials));

var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", headerValue);

или вместо этого оставьте детали этого низкого уровня в библиотеке, такой как IdentityModel Nuget Docs , которая реализует правильные запросы для вас в зависимости от случая.

...