使用Outlook REST API获取照片时获得401-未经授权 – java cliet

我正在尝试使用Outlook REST API检索用户照片( https://msdn.microsoft.com/en-us/office/office365/api/photo-rest-operations#UserphotooperationsGetphoto )

我得到了访问令牌( https://msdn.microsoft.com/en-us/library/azure/dn645543.aspx )

但得到这个错误:任何帮助?

HTTP / 1.1 401未授权[内容长度:0,服务器:Microsoft-IIS / 8.0,请求ID:6925fcab-9021-4059-af4b-4cbf130faea7,X-CalculatedBETarget:CY1PR0401MB1388.namprd04.prod.outlook.com,X- BackEndHttpStatus:401,Set-Cookie:exchangecookie = 87cb2447eae9401c80a96c497dff06a9; 到期= 2017年4月22日星期六07:56:53 GMT; 路径= /; HttpOnly,x-ms-diagnostics:2000001; reason =“访问令牌使用的身份validation方法太弱而无法访问此应用程序。显示的身份validation强度为1,必需为2。”; error_category =“invalid_token” ,

代码看起来像这样:

HttpClient httpclient = HttpClients.createDefault(); final String bearerToken = getBearerToken(); HttpGet request = new HttpGet("https://outlook.office.com/api/v2.0/me/photo/$value"); request.setHeader(javax.ws.rs.core.HttpHeaders.AUTHORIZATION, "Bearer " + bearerToken); request.setHeader(HttpHeaders.CONTENT_TYPE, MediaType.APPLICATION_JSON_VALUE); HttpResponse response = httpclient.execute(request); return IOUtils.toByteArray(response.getEntity().getContent()); 

根据错误消息。 您需要client_assertion ,而不是请求正文中的client_secret

有关更多详细信息,您可以使用Office 365邮件,日历和联系人API(OAuth2客户端凭据流)引用博客构建守护程序或服务应用程序

根据API,您可以调用“ https://outlook.office.com/api/v2.0/me/photo/ $ value”。 您似乎只想获取当前登录用户的照片; 如果是这样,您可以使用授权代码授予流程来获取不需要客户端证书的令牌。

更新#1

这可以通过编程方式/ API方式完成

据我所知,同意需要用户或管理员的互动。

 https://login.windows.net/common/oauth2/authorize?response_type=code&client_id={0}&resource={1}&redirect_uri={2}&prompt={3} 

在此处输入图像描述

如果您正在开发ASP.NET Web应用程序,则可以引用示例项目O365-WebApp-MultiTenant 。

顺便说一句,当使用app-token调用API时,您需要指定用户名。

例如

 https://outlook.office.com/api/v2.0/users('user1@customdomain.onmicrosoft.com')/messages 

更新#2

使用app令牌更新照片时的403代码是预期的结果。 在此处输入图像描述

从上图中可以看出,更新用户照片需要委派权限“User.Read.Write”。 应用令牌无权更新用户的照片。