Microsoft 认知服务 - 身份验证问题,无法获取访问令牌

Posted

技术标签:

【中文标题】Microsoft 认知服务 - 身份验证问题,无法获取访问令牌【英文标题】:Microsoft Cognitive Services - Authentication Issues, Unable to get Access Token 【发布时间】:2016-12-17 03:04:47 【问题描述】:

我正在尝试从 android 调用 ms 认知服务。但是,获取访问令牌的 api 不起作用.. 下面是 android 代码

HttpPost httpPost = new HttpPost("https://api.cognitive.microsoft.com/sts/v1.0/issueToken");


List<NameValuePair> nameValuePair = new ArrayList<NameValuePair>(2);
nameValuePair.add(new BasicNameValuePair("Ocp-Apim-Subscription-Key", "my subscription key"));

try 
    httpPost.setEntity(new UrlEncodedFormEntity(nameValuePair));
 catch (UnsupportedEncodingException e) 



try 
    HttpResponse response = httpClient.execute(httpPost);
 catch (ClientProtocolException e) 
    e.printStackTrace();
 catch (IOException e) 
    e.printStackTrace();

在 logcat 中,我得到错误:

java.net.UnknownHostException: Unable to resolve host "api.cognitive.microsoft.com": No address associated with hostname

api url“https://api.cognitive.microsoft.com/sts/v1.0/issueToken”有变化吗?

另外,当我在浏览器中输入此 URL“https://api.cognitive.microsoft.com/sts/v1.0/issueToken”时,我会收到消息

 "statusCode": 404, "message": "Resource not found" 

请帮忙。

【问题讨论】:

关于“无法解析主机“api.cognitive.microsoft.com””的应用程序端 - 检查防火墙/dns。在浏览器中的行为是正确的,只要 GET 什么都不做 - 你应该在那里发布以获取令牌。 我确认没有任何东西阻止请求.. 防火墙/dns 上没有任何东西。感谢您的建议。还有什么想法。 所以这毕竟是一个错字? 【参考方案1】:

据我所知,api urlhttps://api.cognitive.microsoft.com/sts/v1.0/issueToken没有任何变化,与link中描述的内容相同。

我尝试通过工具Postman调用api,成功获取token,如下。

您无法通过在浏览器中键入 url 获得希望的结果,因为 api 调用是 POST 请求,而不是通过浏览器中的原生 url 的 GET 请求。

根据您的代码,问题似乎是由于缺少所需的内容长度Content-Length: 0 引起的。

作为参考,这是我的示例代码。

URL url = new URL("https://api.cognitive.microsoft.com/sts/v1.0/issueToken");
HttpsURLConnection conn = (HttpsURLConnection) url.openConnection();
conn.setRequestProperty("Ocp-Apim-Subscription-Key", "XXXXXXXX");
conn.setRequestMethod("POST"); 
conn.setDoOutput(true); // Must set do output true
conn.setFixedLengthStreamingMode(0); // Set Content-Length 0
conn.connect();
int code = conn.getResponseCode();
String msg = conn.getResponseMessage();
System.out.println(code+"\t"+msg);
IOUtils.copy(conn.getInputStream(), System.out);

上述代码的响应如下。

200 OK
eyXXXXXXXXXXXXXXXXXXXXXXXXXX

【讨论】:

我尝试了您共享的代码,但出现错误:“12-21 17:18:33.063: W/System.err(5372): java.net.UnknownHostException: Unable to resolve host “api.cognitive.microsoft.com”:没有与主机名关联的地址“ 潘 - 我的错,有一个错字。您的解决方案运行良好。非常感谢您的详细解释。赞赏。

以上是关于Microsoft 认知服务 - 身份验证问题,无法获取访问令牌的主要内容,如果未能解决你的问题,请参考以下文章

在自定义函数中使用 AWS cognito 多因素身份验证

如何使用身份服务器 3 和 microsoft 团队应用程序使用 Azure AD 令牌进行身份验证

向 WCF + Autofac 无扩展服务添加身份验证

具有无状态服务器且无服务器端呈现的 cookie 中的 JWT 身份验证

Microsoft SQL Server错误:18456 + Windows身份验证

Mac 使用Microsoft Remote Desktop无法连接至远程服务器,显示无法验证身份