一张纸条 Api 拒绝 Bearer Token,错误 401
One Note Api rejects Bearer Token, Error 401
我在向 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 Token
和 HttpGet-Request
的 header 看起来像这样,如果我在 debug-mode 中查看它:
但是当我尝试执行 get 时,API 给我一个 401 Unauthorized
错误。
我的范围是 scope=wl.basic+onedrive.readwrite
,因此令牌应该具有它需要的所有权限。
更新: 如果我使用 microsoft-account 登录 https://apigee.com/onenote/embed/console/onenote/ 并将 access-token 从那里复制到这段代码中:
getTopFiveNotebooks.setHeader(HttpHeaders.AUTHORIZATION, "Bearer " + acces-key-from-the apigee-console)
它执行获取并给我 Status 200
而不是 401
。
那我的权限范围是不是错了?
编辑:我的范围是错误的。
是的,您没有合适的范围。
https://msdn.microsoft.com/en-us/library/office/dn807159.aspx
您至少需要 "office.onenote" 才能获取用户的笔记本。
顺便说一句,如果您查看 401 响应的正文,您会发现缺少哪些范围。
以下是一些可能发生错误的情况:
- 请注意范围字符串也必须编码,所以
而不是
+
你应该使用 %20
.
- 还要确保你使用了这个函数,returns任何东西:
Connection.getTokenInJson(tokenResponse)
然后尝试这个对我来说很好用的权限范围:
"office.onenote%20office.onenote_create%20office.onenote_update_by_app%20office.onenote_update"
我在向 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 Token
和 HttpGet-Request
的 header 看起来像这样,如果我在 debug-mode 中查看它:
但是当我尝试执行 get 时,API 给我一个 401 Unauthorized
错误。
我的范围是 scope=wl.basic+onedrive.readwrite
,因此令牌应该具有它需要的所有权限。
更新: 如果我使用 microsoft-account 登录 https://apigee.com/onenote/embed/console/onenote/ 并将 access-token 从那里复制到这段代码中:
getTopFiveNotebooks.setHeader(HttpHeaders.AUTHORIZATION, "Bearer " + acces-key-from-the apigee-console)
它执行获取并给我 Status 200
而不是 401
。
那我的权限范围是不是错了?
编辑:我的范围是错误的。
是的,您没有合适的范围。
https://msdn.microsoft.com/en-us/library/office/dn807159.aspx
您至少需要 "office.onenote" 才能获取用户的笔记本。
顺便说一句,如果您查看 401 响应的正文,您会发现缺少哪些范围。
以下是一些可能发生错误的情况:
- 请注意范围字符串也必须编码,所以
而不是
+
你应该使用%20
. - 还要确保你使用了这个函数,returns任何东西:
Connection.getTokenInJson(tokenResponse)
然后尝试这个对我来说很好用的权限范围:
"office.onenote%20office.onenote_create%20office.onenote_update_by_app%20office.onenote_update"