【发布时间】:2014-01-21 06:59:08
【问题描述】:
过去 10 个月,我们正在运行一项网络服务,该服务一直在使用 OAuth2 登录 Google 帐户。
我想知道在使用新增量身份验证向旧令牌添加新范围时是否存在任何已知或潜在问题,例如几个月前授予的代币?
我们遇到了一个问题,该问题已由我们的两个开发人员验证,但由于我们在非生产环境中只有这么多带有旧刷新令牌的帐户,因此难以重现。请参阅下面的完整故事。我很想知道 Google 的任何人这可能是一个错误,或者更可能是我们做错了什么。
我们很高兴看到新的增量身份验证,因为我们即将推出一项涉及访问用户的 Google 通讯录的新功能,但仅限于特定用例。
因此,我们在服务器上添加了一个新的 OAuth 端点,其中包含 include_granted_scopes 标志并仅请求联系人范围:
my $url = URI->new('https://accounts.google.com/o/oauth2/auth');
my $params = {
state => 'code_request_contacts',
response_type => 'code',
client_id => $config->{oauth_client_id},
redirect_uri => $c->host . '/auth/oauth',
scope => 'https://www.google.com/m8/feeds',
access_type => 'offline',
approval_prompt => 'force',
include_granted_scopes => 'true'
};
在我们的本地开发机器上进行测试时,效果非常好:授予了联系人访问权限,并且相同的令牌适用于联系人和现有范围(包括 userinfo.profile、userinfo.email 和 drive.file)。
但是,当我们开始在已连接现有访问令牌和 Google 帐户的预生产服务器上进行测试时,我们遇到了问题:一旦联系人授权完成,返回的令牌将仅适用于联系人,失败并显示“403用于发出任何 Drive API 请求时,Permissions"不足。
看到这些错误后,我们尝试 (a) 通过帐户权限页面 (https://security.google.com/settings/security/permissions) 撤销访问权限,(b) 注销我们的应用程序,以及 (c) 再次登录以获取具有基本权限的新令牌范围。奇怪的是,此时联系人的增量身份验证就像一个魅力,并且新令牌具有所有组合的范围,如预期的那样。
所以这就是现在的情况——我们已经两次看到了一个问题,该问题可能会阻碍将其推广到生产环境,但如果它的行为涉及旧令牌,我们就无法可靠地重现。
我们当前的解决方法是让联系人 OAuth 请求也包括我们所有的姓名缩写范围。这会导致出现“联系人”弹出窗口时出现更长的警告列表,但否则似乎可以达到预期的最终结果。
【问题讨论】:
标签: google-oauth