Google SSO 不要求仅一个用户的范围(其他用户可以)

Google SSO not asking for scope for just one user (other users OK)

我发现 google SSO 和我的一位用户出现了一个奇怪的问题。

我正在使用 oauth 请求以下范围:

    const url = oauth2Client.generateAuthUrl({
      access_type: 'offline', // we want refresh tokens
      scope: ['email'],
      state: '{...}',  //state object
      prompt: 'consent', 
      hd: 'example.com', // restrict to just our domain
      include_granted_scopes: true,
    });

对于重定向到 url 的所有其他用户,他们在验证后会看到如下所示的同意屏幕:

一位用户除外。对于此用户 - 当他们进行身份验证时,没有同意屏幕,并且他们以最低限度的范围登录。

当用户查看他们的帐户安全页面时,他们会看到我们的 webapp 已获得授权,没有范围。我已经要求用户撤销应用程序权限并尝试重新登录,但同样的事情发生了。他们在没有同意屏幕和范围的情况下登录。同样,奇怪的是它只发生在这个用户身上。

本案的罪魁祸首是:

include_granted_scopes: true,

显示同意屏幕的其他用户在过去的某个时间被赋予了正确的范围,并获得了许可。因此,在任何后续授权中,同意屏幕都会显示之前授予的范围。源代码在某些时候更改并删除了那些特定的范围(因此,我们只剩下问题中显示的 email 范围。

有趣的是,email 范围不需要征得同意,它是自动的,因此它会将用户返回到具有该授权范围的我们的应用程序,而从未向该用户显示同意屏幕。

更改范围以实际包含正确的范围现在允许所有用户看到同意屏幕并授予正确的范围:

    const url = oauth2Client.generateAuthUrl({
      access_type: 'offline', // we want refresh tokens
      scope: ['email',
              'https://www.googleapis.com/auth/gmail.readonly',
              'https://www.googleapis.com/auth/gmail.labels',
              'https://www.googleapis.com/auth/gmail.modify',
             ],
      state: '{...}',  //state object
      prompt: 'consent', 
      hd: 'example.com', // restrict to just our domain
      include_granted_scopes: true,
    });