我正在尝试在我的应用程序中使用 Google Oauth2实现增量授权。
起初,当用户登录时,应用程序正在请求一些范围和离线访问。我正在生成并存储 refreshToken 在我的数据库中,以便我可以刷新访问令牌以在需要时进行 API 调用。
现在我要实现一个新功能,它会请求一个新的范围,但我只想在用户尝试使用这个新功能时才请求这个范围。
我面临的问题是,当应用程序提示用户同意新范围时,Google 正在请求访问所有以前接受的范围。
我尝试过不进行离线访问(使用“授予”方法),它似乎正在工作(正如描述中所说的“向用户请求额外的范围。”)。这样做,谷歌只请求新的范围,并且生成的访问令牌似乎工作正常。但是,如果我尝试离线访问(使用'grantOfflineAccess' 方法),Google 会要求提供所有范围。如果我再次接受所有范围,它会返回一个授权码,我可以再次生成 refreshToken,但我只想接受新范围。
我想知道在请求脱机访问时可能无法做到这一点,因为您需要生成一个具有所有范围的新 refreshToken,但我找不到任何有关此的信息。
我做错了什么还是无法通过离线访问来实现这一点?
更新:还生成 URL(而不是使用 JS 库),如此处所述,Google 要求提供所有范围。这将是生成的 URL 的示例:
https://accounts.google.com/o/oauth2/v2/auth?
scope=my_new_scope&
redirect_uri=https://myapp.example.com/callback&
response_type=code&
client_id=my_client_id&
prompt=consent&
include_granted_scopes=true
UPDATE2:我在这里发现了一个报告的问题,有人评论说不可能对已安装的应用程序执行此操作。但是有一条评论解释了如何使用网络服务器流来做到这一点,这些是使用 OAuth2 操场(https://developers.google.com/oauthplayground)的步骤:
1)选择谷歌日历范围。
2) 授权访问
3) 代币兑换码。
4) 向令牌信息端点发出请求: https ://www.googleapis.com/oauth2/v2/tokeninfo?access_token= ...
5) 验证令牌是否仅包含 Google 日历范围。
6) 取消选择 Google Calendar 范围并选择 Google Drive 范围。
7) 在授权窗口中编辑 URL 并附加 &include_granted_scopes=true。
8) 授权驱动范围。
9) 将代码换成代币。
10) 向令牌信息端点发出请求。
11) 验证它是否包含日历和驱动器范围。
做同样的事情,我在第一次验证中获得日历范围,在第二次验证中获得驱动范围。即使使用刷新令牌,我也无法获得具有两个范围的访问令牌。在那之后,这很奇怪,我检查了可以访问我的帐户的应用程序,并且 OAuth2 游乐场有两个范围:
先感谢您!
