OneDrive - правильная комбинация Oauth, Scope и Service Endpoint - PullRequest
0 голосов
/ 30 августа 2018

Мои требования состоят в том, чтобы получить доступ к учетной записи OneDrive пользователя с помощью моего приложения (то есть, чтобы иметь возможность читать / записывать в мою папку приложений) и получать информацию о пользователе (имя / адрес электронной почты). Я зарегистрировал свое приложение ... И похоже, это работает, потому что я получаю подтверждение своих областей при попытке войти в свою учетную запись. У меня возникают проблемы при преобразовании кода в токен доступа, или в некоторых случаях, когда я получаю access_token, он недопустим для конечной точки службы, которую я использую. Я работал с различными комбинациями из следующих:

Oauth Options (Code Flow): 
    https://login.microsoftonline.com/common/oauth/v2/authorize
    https://login.live.com/oauth20_authorize.srf
Scopes Varients (With/Without endpoint prefix):
    Files.ReadWrite.AppFolder
    OneDrive.AppFolder
Service Endpoints:
    https://graph.microsoft.com/
    https://api.onedrive.com/

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

{ "ошибка": "unauthorized_client", "error_description": "AADSTS70001: Приложение с идентификатором 0000000048240701 не найдено в directory 9188040d-6c67-4c5b-b112-36a304b66dad \ r \ nTrace ID: 87f0c3e6-0d9f-4ccf-b3e9-c7d43b422800 \ r \ nКорреляционный идентификатор: 7f440db6-eba9-4a0c-8d1f-54ae5c21d0cd \ r \ nTimestamp: 2018-08-30 16: 12: 38Z " "error_codes": [70001], "Timestamp":" 2018-08-30 16: 12: 38Z», "trace_id": "87f0c3e6-0d9f-4ccf-b3e9-c7d43b422800", "correlation_id": "7f440db6-eba9-4a0c-8d1f-54ae5c21d0cd"}

Кто-нибудь может порекомендовать правильный набор опций, на которых мне следует сосредоточиться?

Мои текущие объявления кода:

private static String sClientID = "75417aa8-5567-4095-97fa-e09da6e1d8fb";
private static String sClientSecret = "LzAmOFF13Hgzob ... ";
private static String sCodeURL  = "https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=%s&scope=%s&response_type=code&state=%s&redirect_uri=%s";
private static String sScope = "https://graph.microsoft.com/User.Read https://graph.microsoft.com/Files.Read https://graph.microsoft.com/Files.ReadWrite.AppFolder";
private static String sTokenURL = "https://login.microsoftonline.com/common/oauth2/v2.0/token";
private static String sTokenArgs = "code=%s&grant_type=authorization_code&client_id=%s&client_secret=%s&redirect_uri=%s";
private static String sAPIRootURL = "https://graph.microsoft.com/v1.0";

Все аргументы имеют URL-кодировку при вставке в URL-адреса.

Удаление параметра Query из URI перенаправления решило проблему запроса токена. Я использовал один и тот же URI перенаправления как для запроса авторизации, так и для запроса токена. То, что первое сработало, меня смутило. Я также использую "Конвергентный" идентификатор приложения, основанный на предложении от Марка. Я все еще получаю ошибку с моим первым запросом API: https://graph.microsoft.com/v1.0/me/

Мой код Java:

String _url = sAPIRootURL + "/me/";
u = new URL(_url);
uc = (HttpURLConnection) u.openConnection();
uc.setRequestMethod("GET");
uc.setRequestProperty("Authorization", String.format("Bearer %s", 
mSessionInfo.BearerToken));
uc.setRequestProperty("Content-Type", "application/json");

{"code": "BadRequest", "message": "тип MIME" text / html, image / gif, image / jpeg, *; q = .2, / ; q = .2 'требуется символ' / ' между типом и подтипом, например «text / plain». ", "innerError": { "request-id": "f627bd8a-bc3a-4bb4-928a-a0daf7112368", "дата": "2018-09-05T01: 28: 59" }

Я проверил, что ответ на запрос токена включает область User.Read.

App Registration

...