microsoft-graph-api - 为什么添加“offline_access”会使 MS Graph 范围无效,否则我如何获得刷新令牌?
问题描述
我正在尝试从 Microsoft Graph 请求访问令牌和刷新令牌,但将“offline_access”添加到范围会使范围无效。
这适用于用户允许我们访问 Outlook 日历一次的服务,之后该服务每 20 分钟检查一次他们的日历中的事件。在请求访问“User.Read”和“”时,我已经设法获得同意并提取数据Calendars.Read
,但是当我添加“ offline_access
”时,我收到了消息The provided resource value for the input parameter 'scope' is not valid.
我有一个具有我想要的权限的数组
private static final String[] ACCESS_PERMISSIONS = {
"https://graph.microsoft.com/User.Read",
"https://graph.microsoft.com/Calendars.Read",
"https://graph.microsoft.com/offline_access",
};
然后将它们组合并编码
String encodedScope = URLEncoder.encode(
Arrays.stream(ACCESS_PERMISSIONS)
.reduce(
(a,b) -> a + " " + b)
.get(), "UTF-8").replace("+","%20");
这导致字符串https%3A%2F%2Fgraph.microsoft.com%2FUser.Read%20https%3A%2F%2Fgraph.microsoft.com%2FCalendars.Read%20https%3A%2F%2Fgraph.microsoft.com%2Foffline_access
然后我请求令牌
String appId = "client_id=" + clientID;
String scope = "&scope=" + encodedScope;
String authCode = "&code=" + code;
String redirect = "&redirect_uri=" + redirectUri;
String grantType = "&grant_type=authorization_code";
String secret = "&client_secret=" + clientSecret;
String data = appId + scope + authCode + redirect + grantType + secret;
// Create POST request
URL url = new URL(postUrl);
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
// Configure request
connection.setRequestMethod("POST");
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
connection.setRequestProperty("Accept", "application/json");
connection.setDoOutput(true);
// Send data
OutputStream os = connection.getOutputStream();
byte[] inputBytes = data.getBytes(ENCODING);
os.write(inputBytes, 0, inputBytes.length); // Bytes, Offset, Length
最后的链接看起来像
https://login.microsoftonline.com/common/oauth2/v2.0/authorize?
client_id=[CLIENT ID]
&response_type=code
&redirect_uri=http%3A%2F%2Flocalhost%3A8080%2Fsport%2Fauth%2Foutlook
&response_mode=query
&scope=https%3A%2F%2Fgraph.microsoft.com%2FUser.Read%20https%3A%2F%2Fgraph.microsoft.com%2FCalendars.Read%20https%3A%2F%2Fgraph.microsoft.com%2Foffline_access
&state=2737
我希望这会返回一个访问令牌和一个刷新令牌,但如前所述,我收到消息指出范围的资源值无效。
该服务必须能够刷新令牌,因为它应该运行大约一年而无需干预。
解决方案
范围不是https://graph.microsoft.com/offline_access
,它只是offline_access
。脱机访问是一个特殊的 AAD 范围,它告诉它返回一个刷新令牌,它不是 Microsoft Graph 范围。
你实际上可以https://graph.microsoft.com/
全面下降。唯一需要指定 FQDN 的时候是当您从应用注册请求默认范围集(即https://graph.microsoft.com/.default
)时,但通常仅在您使用 App-Only/Daemon 身份验证流程(客户端凭据)时使用。
推荐阅读
- java - 如何从 java 应用程序运行 windows 命令提示符?
- kubernetes - 如何将 PodSecurityPolicy 应用于非 kube-system 命名空间资源?
- java - Spring xml主bean
- javascript - 如何将变量从 node.js 函数传递到 graphql-tag?
- arrays - 将数组元素的基数从八进制更改为十进制(在远程运行的本地 bash 脚本中)
- java - 如何将自定义 restTemplate istance 添加到 RestTemplateEurekaHttpClient
- python - 如何为一系列不同的问题输入 10 次
- android - Android Keystore 崩溃,大多数在三星设备、Android 8 和 8.1 上,在 Android 应用程序启动时
- python - 如何在类中的函数中使用追加和扩展而不在同一个类中明确定义它们?
- c# - Azure 函数:客户 HTTP 路由中的查询参数有问题