C#IBM Speech to Text使用API​​Key获取令牌

时间:2018-10-26 16:17:54

标签: c# authentication websocket ibm-watson speech-to-text

基于https://gist.github.com/nfriedly/0240e862901474a9447a600e5795d500上的示例, 我正在尝试使用WebSocket使用IBM Speech to Text API。 但是我在身份验证部分遇到了问题。 看来现在IBM不再提供用户名/密码。 只有api键。

所以我找不到添加该示例以使用api获取令牌的方法。

有人知道如何将WebSocket与IBM apikey一起使用进行身份验证吗? IBM文档似乎也不是最新的,因为他们的示例正在使用带有用户名和密码https://console.bluemix.net/docs/services/speech-to-text/getting-started.html#getting-started-tutorial

的CURL

我什至看到某个地方可以用apikey将用户名替换为“ api”和密码。 但这不起作用,因为我从服务器收到未经授权的错误。

也许我读错了,应该传递令牌而不是密码。 但是,如何使用websockets从我的APIkey获取令牌?

我可以使用HttpClient毫无问题地获得令牌。 但是看来之后我无法再将该令牌与Websocket一起使用,只能再进行HttpClient调用。

1 个答案:

答案 0 :(得分:1)

在一些帮助下,我终于找到了如何使用apiKey处理WebSocket。

如果有人需要,我会在这里发布代码

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 ...