同一应用程序中不同流程的 OAuth 范围?

OAuth scopes for different flows in same application?

上下文

我有一个 Node.js 应用程序,它有一组 "complex" OAuth 流程,以使用户体验更简单。

我有通常的登录和注册流程,您可以在其中使用 OAuth 提供程序进行身份验证。我在这里不需要任何特殊的 scope,因为 OAuth 纯粹用于身份验证,用户没有理由要给我提升访问权限(比如私有 GitHub 存储库),甚至可能认为这是一个阴暗的问题,所以他离开了,再也没有访问过我的产品。因此,没有 scope 用于纯身份验证流程。

该应用程序还具有导入功能,您可以在其中从 OAuth 提供程序(例如,GitHub 存储库)导入实体列表。默认情况下,您也不会在此处要求任何 scope

单击 "Looking for your private repositories?" 按钮会再次根据 GitHub 对您进行身份验证,要求 repo 范围。这一切都很好。

问题

是当用户尝试再次登录,或以其他方式做任何可能对他们进行身份验证但未明确请求 repo 范围时,GitHub 认为这是一个明确的降级请求。

问题是用户无缘无故不想在登录期间降级。同样,我不想在登录期间请求比我需要更多的权限

让事情处于这种状态比在登录时要求 repo 更糟糕,但这也是一个非常糟糕的选择。

可能的解决方案

除了这两个非解决方案,我想出的潜在解决方案是:

那就太好了,只是它太有状态了,而且我还没有找到一种方法来做到这一点;他们似乎为每个应用程序用户提供一个令牌,我怀疑 OAuth 大多数情况下就是这样工作的,但我不是这方面的专家。

我觉得这应该是默认行为。无论如何,有什么方法可以告诉 GitHub 不要降级令牌?

如果不是,是否有任何其他方法可以解决此问题而无需求助于在整个应用程序中请求相同的范围?这首先会部分破坏作用域的目的。

此外,这是 GitHub 特有的问题吗?我是否必须在逐个提供者的基础上处理这个问题?是否有协议级的解决方案奇迹般地使问题消失?还是 OAuth 在构建时并未考虑用户体验?

FWIW 我正在使用 iojspassportjs,但我认为这与问题无关。

原来问题出在我的代码中,就像往常一样。我在身份验证流程中明确设置了 属性 options.scope: [],对于那些使用护照的人),这导致了 GitHub 授权 URL 包含 &scope=&,这意味着我明确要求降级。

如果我没有明确的范围要求解决问题,请删除该选项。哇!