Я пытаюсь запросить токен доступа и токен обновления у 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
Я ожидаю, что это вернет токен доступа и токен обновления, но, как упоминалось ранее, я получаю сообщение о том, что значение ресурса для области действия недопустимо.
Служба должна иметь возможность обновлять токены, поскольку она должна работать около года без вмешательства.