OAUTH2.0 токен на предъявителя не работает

Я использую модификацию 2.0 для сборки REST-клиента Bitbucket на Android.

Насколько мне известно, OAUTH2.0 предоставляет "неявное предоставление", которое дает клиенту токен Bearer для доступа сразу же, когда пользователь входит в свою учетную запись при появлении соответствующего запроса.

Токены на предъявителя - это токены, которые можно использовать для доступа к защищенному ресурсу. Любой, у кого есть токен на предъявителя, имеет право доступа к защищенному ресурсу, как и любой другой, у кого также есть токен на предъявителя. (согласно этому документу от IETF)

Пожалуйста, исправьте меня, если я ошибаюсь, но я подумал, что используя неявное предоставление, после входа пользователей в свою учетную запись Bitbucket у меня будет токен доступа на предъявителя. После этого я могу использовать этот токен доступа для доступа к защищенному ресурсу в Bitbucket (например, создать новый репозиторий).

Итак, я построил свой Android с использованием неявного предоставления OAUTH2.0, как описано в документе Bitbucket. Обратите внимание, что они описали ответ будет иметь #access_token={token}&token_type=bearer

И это то, что я на самом деле получил от Bitbucket после входа в систему:

your://redirecturi#access_token=lEuvneW39onVrnNR-jvZfirI43fwi5Wdc0YaaMROBk5YKJsd2ulXm20vJDdOBjf8I-Ne2r2vC8-_FHECSLw%3D&scopes=pipeline%3Awrite+webhook+snippet%3Awrite+wiki+issue%3Awrite+pullrequest%3Awrite+repository%3Adelete+repository%3Aadmin+project%3Awrite+team%3Awrite+account&expires_in=3600&token_type=bearer

Мой первый вопрос: что такое токен доступа на предъявителя из приведенного выше ответа?

Является ли часть lEuvneW39onVrnNR-jvZfirI43fwi5Wdc0YaaMROBk5YKJsd2ulXm20vJDdOBjf8I-Ne2r2vC8-_FHECSLw токен доступа на предъявителя? Нужно ли включать "%3D" (который является символом "=", закодированным в ASCII)? Разве документ Bitbucket не означает, что все, кроме последнего "&token_type=bear", является токеном доступа Bear?

Это не все. Инструкция Bitbucket doc, чтобы сделать запрос следующим образом:

Отправьте его в заголовке запроса: Авторизация: Bearer {access_token}

Поэтому я настроил этот запрос на создание нового репозитория в соответствии с API Bitbucket:

@POST("repositories/{username}/{repo_slug}")
    Call<Repository> createRepository(
            @Header("Authorization") String auth,
            @Path("username") String userName,
            @Path("repo_slug") String repoSlug);

Но каждый раз я получал ответы с кодом состояния 401 и сообщением об ошибке:

Срок действия маркера истек. Используйте свой токен обновления, чтобы получить новый токен доступа.

Когда я попытался отправить тот же запрос с помощью DHC с помощью Restlet (расширение Chrome, такое как Postman), появляется всплывающее окно, требующее от меня входа в Bitbucket. Если я отказываюсь сделать это, я получаю ту же ошибку 401 ответ. Если я делаю логин, то это работает.

Мой второй вопрос: почему я должен предоставить свои учетные данные снова?

Я думаю, что здесь что-то не так. Я подумал, что с токеном доступа Bearer я смогу получить доступ к защищенному ресурсу без необходимости входа в систему до того, как истечет время истечения токена доступа. Почему я должен ввести свои учетные данные во второй раз? Это не то, что описано в подходе "неявного предоставления" здесь IETF.

1 ответ

Значение access_token начинается после access_token= и заканчивается перед следующим параметром scopes так раньше &scopes=, Форматирование фрагмента указано в https://tools.ietf.org/html/rfc6749, который в свою очередь указывает на https://www.w3.org/TR/1999/REC-html401-19991224/interact/forms.html, где говорится:

[...] Имя отделяется от значения = и пары имя / значение отделены друг от друга & [...]

Таким образом, ваше значение токена доступа по спецификации lEuvneW39onVrnNR-jvZfirI43fwi5Wdc0YaaMROBk5YKJsd2ulXm20vJDdOBjf8I-Ne2r2vC8-_FHECSLw%3D но я согласен что концовка %3D является подозрительным и может быть ошибкой со стороны отправителя.

Если срок действия вашего токена доступа истек (как это и должно быть), вам необходимо получить новый, снова используя неявное предоставление или использование обновления маркера.

Другие вопросы по тегам