One Note Api拒绝承载令牌,错误401

时间:2017-02-02 11:52:40

标签: java apache apache-httpclient-4.x onenote onenote-api

我遇到了将承载令牌发送到One Note API的问题。

String returnUri = "https://login.live.com/oauth20_token.srf";
HttpClient client = HttpClientBuilder.create().build();
HttpPost tokenRequest = new HttpPost(returnUri);
tokenRequest.setHeader(HttpHeaders.CONTENT_TYPE, "application/x-www-form-urlencoded");
tokenRequest.setEntity(new UrlEncodedFormEntity(Connection.getParametersForURLBody(), Consts.UTF_8));
tokenRequest.addHeader("User-Agent", "Mozilla/5.0 (Windows NT 6.3; WOW64; rv:28.0) Gecko/20100101 Firefox/28.0");
HttpResponse tokenResponse = client.execute(tokenRequest);
HttpGet getTopFiveNotebooks = new HttpGet("https://www.onenote.com/api/v1.0/me/notes/notebooks?top=5");

getTopFiveNotebooks.setHeader(HttpHeaders.AUTHORIZATION, "Bearer " + Connection.getValueByKey("access_token", Connection.getTokenInJson(tokenResponse)));

我得到了Bearer TokenHttpGet-Request的标题如下所示,如果我在调试模式中查看它:

Token in the HtppGet-Header

但是当我尝试执行get时,API会给我一个401 Unauthorized错误。

我的范围是scope=wl.basic+onedrive.readwrite,因此令牌应具有所需的所有权限。

更新:如果我使用我的microsoft-account登录https://apigee.com/onenote/embed/console/onenote/并将访问令牌从那里复制到这段代码中:

getTopFiveNotebooks.setHeader(HttpHeaders.AUTHORIZATION, "Bearer " + acces-key-from-the apigee-console)

它执行获取并返回Status 200而不是401

我的许可范围是错误的吗?

编辑:我的范围是错误的。

2 个答案:

答案 0 :(得分:0)

是的,你没有合适的范围。

https://msdn.microsoft.com/en-us/library/office/dn807159.aspx

您至少需要“office.onenote”才能获得用户的笔记本。

顺便说一句,如果你查看401响应的正文,你会看到缺少哪些范围。

答案 1 :(得分:0)

以下是可能发生错误的一些情况:

  1. 请注意,范围字符串也必须编码,所以 而不是+,您应该使用%20
  2. 还要确保您使用的此功能返回任何内容: Connection.getTokenInJson(tokenResponse)
  3. 试试这个权限范围对我来说很好:

    "office.onenote%20office.onenote_create%20office.onenote_update_by_app%20office.onenote_update"