Обмен кода для токена доступа не выполняется при использовании входа в Google в Dropbox - PullRequest
0 голосов
/ 04 сентября 2018

У нас есть приложение, которое использует Dropbox API. Когда пользователь проходит поток Dropbox OAuth 2 и входит в систему, используя свой адрес электронной почты и пароль, все работает нормально, и мы получаем access_token. Однако, когда пользователь использует поток «Войти в Google» в диалоговом окне авторизации Dropbox, мы получаем обратно code, который затем пытаемся обменять на токен доступа, но запрос не выполняется с {"error_description": "code doesn't exist or has expired", "error": "invalid_grant"}.

Вот шаги, которые мы используем:

1

var dbx = new Dropbox.Dropbox({ clientId: clientId });
var authUrl = dbx.getAuthenticationUrl('https://www.dropbox.com/1/oauth2/redirect_receiver');

Это дает нам URL https://www.dropbox.com/oauth2/authorize?response_type=token&client_id=...&redirect_uri=https://www.dropbox.com/1/oauth2/redirect_receiver.

2. Откройте authUrl во всплывающем окне.

3. Пользователь использует "Войти через Google"

4. Мы получаем перенаправление на URL ниже, который содержит код: https://www.dropbox.com/google/authcallback?state=...&code=...&scope=...

Теперь попытка обменять код для токена доступа с POST на https://api.dropboxapi.com/oauth2/token дает нам: {"error_description": "code doesn't exist or has expired", "error": "invalid_grant"}

1 Ответ

0 голосов
/ 04 сентября 2018

Проблема здесь в том, что при использовании потока входа в Google на самом деле происходит два экземпляра потока авторизации OAuth; поток входа в Google вложен в поток авторизации приложения Dropbox. Ваше приложение на самом деле не должно знать об этом.

Этот https://www.dropbox.com/google/authcallback URL является URL-адресом перенаправления Dropbox для потока входа в Google, и, соответственно, code указан для потока OAuth Google, а не для потока OAuth Dropbox. Попытка использовать его для потока Dropbox OAuth 2, соответственно, потерпит неудачу, как вы уже видели (так как на самом деле это было из Google, а не из Dropbox).

Ваше приложение должно подождать, пока ваш собственный URL-адрес перенаправления (в вашем общем коде, https://www.dropbox.com/1/oauth2/redirect_receiver) будет доступен, и только затем взять оттуда code и обменять его на токен доступа Dropbox.

...