Google OAuth 2.0 include_granted_scopes не работает для установленного приложения
Я пытаюсь использовать новую инкрементную авторизацию для установленного приложения, чтобы добавить области к существующей авторизации при сохранении существующих областей. Это сделано с использованием нового include_granted_scopes=true
параметр. Однако, что бы я ни пытался, повторная авторизация всегда полностью перезаписывает области видимости. Вот минимальный скрипт Bash PoC, который я написал для демонстрации своей проблемы:
client_id='716905662885.apps.googleusercontent.com' # throw away client_id (non-prod)
client_secret='CMVqIy_iQqBEMlzjYffdYM8A' # not really a secret
redirect_uri='urn:ietf:wg:oauth:2.0:oob'
while :
do
echo "Please enter a list of scopes (space separated) or CTRL+C to quit:"
read scope
# Form the request URL
# http://goo.gl/U0uKEb
auth_url="https://accounts.google.com/o/oauth2/auth?scope=$scope&redirect_uri=$redirect_uri&response_type=code&client_id=$client_id&approval_prompt=force&include_granted_scopes=true"
echo "Please go to:"
echo
echo "$auth_url"
echo
echo "after accepting, enter the code you are given:"
read auth_code
# swap authorization code for access token
# http://goo.gl/Mu9E5J
auth_result=$(curl -s https://accounts.google.com/o/oauth2/token \
-H "Content-Type: application/x-www-form-urlencoded" \
-d code=$auth_code \
-d client_id=$client_id \
-d client_secret=$client_secret \
-d redirect_uri=$redirect_uri \
-d grant_type=authorization_code)
access_token=$(echo -e "$auth_result" | \
grep -Po '"access_token" *: *.*?[^\\]",' | \
awk -F'"' '{ print $4 }')
echo
echo "Got an access token of:"
echo $access_token
echo
# Show information about our access token
info_result=$(curl -s --get https://www.googleapis.com/oauth2/v2/tokeninfo \
-H "Content-Type: application/json" \
-d access_token=$access_token)
current_scopes=$(echo -e "$info_result" | \
grep -Po '"scope" *: *.*?[^\\]",' | \
awk -F'"' '{ print $4 }')
echo "Our access token now allows the following scopes:"
echo $current_scopes | tr " " "\n"
echo
echo "Let's add some more!"
echo
done
Сценарий просто выполняет авторизацию OAuth, а затем распечатывает области, которые токен в настоящее время авторизован для использования. Теоретически следует продолжать добавлять области каждый раз до конца, но на практике список областей каждый раз перезаписывается. Таким образом, идея будет на первом запуске, вы будете использовать минимальный объем чего-то вроде email
и затем следующий запуск, придерживайтесь чего-то более похожего на календарь только для чтения https://www.googleapis.com/auth/calendar.readonly
, Каждый раз пользователю нужно только запросить авторизацию запрашиваемых в настоящее время областей, но полученный в результате токен должен подходить для всех областей, включая те, которые были авторизованы в предыдущих запусках.
Я пробовал с новым client_id / secret и результаты такие же. Я знаю, что мог бы просто снова включить уже авторизованные области, но это запрашивает у пользователя все области, даже те, которые уже предоставлены, и мы все знаем, что чем длиннее список областей, тем меньше вероятность того, что пользователь примет это.
ОБНОВЛЕНИЕ: во время дальнейшего тестирования я заметил, что разрешения для моего приложения показывают объединенные области каждой добавочной авторизации. Я пытался подождать примерно 30 секунд после инкрементной аутентификации, а затем захватить новый токен доступа с токеном обновления, но этот токен по-прежнему ограничен областями последней авторизации, а не списком объединенных областей.
ОБНОВЛЕНИЕ 2: я также играл с сохранением оригинального жетона обновления. Токен обновления получает только новые токены доступа, которые разрешают исходные области, добавленные области не включены. Таким образом, кажется, что эффективно include_granted_scopes=true
не влияет на токены, старые и новые токены обновления продолжают работать, но только для указанных областей. Я не могу получить "комбинированную область" обновления или токен доступа.
2 ответа
Сервис Google OAuth 2.0 не поддерживает добавочную аутентификацию для установленных / собственных приложений; это работает только для веб-сервера. Их документация нарушена.
Попробуйте добавить полный список областей действия ко второму запросу, где вы меняете код авторизации на токен доступа. Достаточно странно, scope
Параметр не задокументирован, но он присутствует в запросах, сгенерированных google-api-java-client. Например:
code=foo&grant_type=authorization_code
&redirect_uri=http%3A%2F%2Flocalhost%3A8080%2Fmyapp%2FoauthCallback
&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.email+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fuserinfo.profile+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fplus.me+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fplus.stream.write
В сценарии с веб-сервером полный список предоставленных областей возвращается вместе с кодом авторизации, когда include_granted_scopes
установлен в true. Это еще одна часть информации, которая, по-видимому, отсутствует в связанной документации.
Редактировать 1 Включение полного списка областей действия в запрос обмена кодами работает для нас в нашем приложении Java, но я только что попробовал ваш оригинальный скрипт без изменений (за исключением идентификатора клиента / секрета), и он работает просто отлично (отредактировал только идентификаторы и токены):
$ bash tokens.sh
Please enter a list of scopes (space separated) or CTRL+C to quit:
https://www.googleapis.com/auth/userinfo.profile
Please go to:
https://accounts.google.com/o/oauth2/auth?scope=https://www.googleapis.com/auth/userinfo.profile&redirect_uri=urn:ietf:wg:oauth:2.0:oob&response_type=code&client_id=189044568151-4bs2mcotfi2i3k6qp7vq8c6kbmkp2rf8.apps.googleusercontent.com&approval_prompt=force&include_granted_scopes=true
after accepting, enter the code you are given:
4/4qXGQ6Pt5QNYqdEuOudzY5G0ogru.kv_pt5Hlwq8UYKs_1NgQtlUFsAJ_iQI
Got an access token of:
ya29.1.AADtN_XIt8uUZ_zGZEZk7l9KuNQl9omr2FRXYAqf67QF92KqfvXliYQ54ffg_3E
Our access token now allows the following scopes:
https://www.googleapis.com/auth/userinfo.profile
https://www.googleapis.com/auth/userinfo.email
https://www.googleapis.com/auth/plus.me
https://www.googleapis.com/auth/plus.circles.read
Вы можете видеть, что ранее предоставленные области включены...