Почему добавление «offline_access» делает недействительной область действия MS Graph и как в противном случае получить токен обновления? - PullRequest
0 голосов
/ 30 октября 2019

Я пытаюсь запросить токен доступа и токен обновления у 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

Я ожидаю, что это вернет токен доступа и токен обновления, но, как упоминалось ранее, я получаю сообщение о том, что значение ресурса для области действия недопустимо.

Служба должна иметь возможность обновлять токены, поскольку она должна работать около года без вмешательства.

1 Ответ

1 голос
/ 30 октября 2019

Объем не https://graph.microsoft.com/offline_access, это просто offline_access. Автономный доступ - это специальная область AAD, которая сообщает о необходимости возврата маркера обновления. Это не область действия Microsoft Graph.

Вы можете фактически пропустить https://graph.microsoft.com/ через доску. Единственное время, когда вам нужно указать полное доменное имя, - это когда вы запрашиваете набор областей по умолчанию из регистрации приложения (т. Е. https://graph.microsoft.com/.default), но это обычно используется только при использовании потока аутентификации App-Only / Daemon (ClientПолномочия).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...