C # IBM Speech to Text Получить токен с помощью APIKey - PullRequest
0 голосов
/ 26 октября 2018

На основании примера на https://gist.github.com/nfriedly/0240e862901474a9447a600e5795d500, Я пытаюсь использовать WebSocket для использования IBM Speech to Text API. Но у меня проблемы с аутентификацией. Похоже, что теперь IBM больше не предоставляет имя пользователя и пароль. Только ключ API.

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

Кто-нибудь знает, как использовать WebSocket с IBM Apikey для аутентификации? Документ IBM, похоже, не актуален, так как в их примере используется CURL с именем пользователя и паролем https://console.bluemix.net/docs/services/speech-to-text/getting-started.html#getting-started-tutorial

Я даже где-то видел, что я могу заменить имя пользователя на "api", а пароль - на мой apikey. Но это не работает, поскольку я получаю несанкционированную ошибку с сервера.

Может быть, я неправильно прочитал, и вместо пароля я должен передать токен. Но тогда как мне получить токен от моего API-ключа с веб-сокетами?

Я могу получить токен с помощью HttpClient без проблем. Но похоже, что после этого я не смогу использовать этот токен с Websocket, только для дальнейших вызовов HttpClient.

1 Ответ

0 голосов
/ 02 ноября 2018

С некоторой помощью я наконец нашел, как обращаться с WebSocket с помощью apiKey.

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

IamTokenData GetIAMToken(string apikey)
{
  var wr = (HttpWebRequest)WebRequest.Create("https://iam.bluemix.net/identity/token");
  wr.Proxy = null;
  wr.Method = "POST";
  wr.Accept = "application/json";
  wr.ContentType = "application/x-www-form-urlencoded";

  using (TextWriter tw = new StreamWriter(wr.GetRequestStream()))
  {
    tw.Write($"grant_type=urn:ibm:params:oauth:grant-type:apikey&apikey={apikey}");
  }
  var resp = wr.GetResponse();
  using (TextReader tr = new StreamReader(resp.GetResponseStream()))
  {
    var s = tr.ReadToEnd();
    return JsonConvert.DeserializeObject<IamTokenData>(s);
  }
}

IamTokenData tokenData = GetIAMToken([Your IamApiKey]);

CancellationTokenSource cts = new CancellationTokenSource();

ClientWebSocket clientWebSocket = new ClientWebSocket();

clientWebSocket.Options.Proxy = null;
clientWebSocket.Options.SetRequestHeader("Authorization", $"Bearer {token.AccessToken}");

// Make the sure the following URL is that one IBM pointed you to
Uri connection = new Uri($"wss://gateway-wdc.watsonplatform.net/speech-to-text/api/v1/recognize");
try
{
  //await clientWebSocket.ConnectAsync(connection, cts.Token);
  clientWebSocket.ConnectAsync(connection, cts.Token).GetAwaiter().GetResult();
  Console.WriteLine("Connected!");
}
catch (Exception e)
{
  Console.WriteLine("Failed to connect: " + e.ToString());
  return null;
}

// ... Do what you need with the websocket after that ...
...