为什么添加"offline_access"会使 MS Graph 范围失效,以及如何以其他方式获取刷新令牌?



我正试图从Microsoft Graph请求访问令牌和刷新令牌,但将"offline_access"添加到作用域会使作用域无效。

这是一项服务,用户允许我们访问Outlook日历一次,之后该服务每20分钟检查一次日历中的事件。在请求访问"User.Read"one_answers"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。Offline Access是一个特殊的AAD作用域,告诉它返回刷新令牌,它不是Microsoft Graph作用域。

实际上,您可以将https://graph.microsoft.com/全面删除。您唯一需要指定FQDN的时间是从应用程序注册请求默认作用域集(即https://graph.microsoft.com/.default(,但通常只有在使用"仅应用程序/守护程序"身份验证流(客户端凭据(时才使用该FQDN。

最新更新