OAuth范围在同一应用程序中的不同stream量?

上下文

我有一个Node.js应用程序,它具有一套“复杂”的OAuthstream程,以使UX更简单。

我有通常的login和注册stream程,您可以使用OAuth提供程序进行身份validation。 这里我不需要任何特殊的scope ,因为OAuth纯粹用于身份validation,用户没有理由要给我提升权限(比如私人的GitHub仓库),甚至可能认为这是一个可疑的事情,所以他离开了,再也不会访问我的产品。 所以,没有纯粹的authenticationstream程的scope

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

example.png

点击“寻找你的私人存储库?” button再次validation你对GitHub,要求repo范围。 这一切都很好。

问题

当用户尝试再次login或以其他方式进行身份validation但不明确请求repo作用域时,GitHub认为这是明确的降级请求。

downgrade.png

问题是用户在login过程中不会因为没有特殊原因而降级 。 同样, 我不想在login时要求比我需要更多的权限

离开这个状态的东西比在login时要求repo更糟糕,但这也是一个非常糟糕的select。

潜在的解决scheme

除了两个非解决scheme,我提出的潜在解决scheme是:

  • 根据请求的scope明确地询问GitHub的唯一访问令牌 ,分别存储令牌,然后根据需要使用它们

那真是太好了,除非它是有状态的,我还没有find办法去做; 他们似乎给每个应用程序用户一个单一的令牌,我怀疑OAuth是如何工作的,但我几乎不是这方面的专家。

  • 如果GitHub拥有比所要求的更多的特权,请明确告知GitHub 不要降级它。

这听起来应该是默认的行为。 无论如何, 有什么办法可以告诉GitHub不要降级令牌吗?

如果没有,有没有其他办法可以解决这个问题,而不是在整个应用程序中要求相同的范围? 这首先会部分地破坏示波器的目的。

另外,这是一个GitHub的具体问题? 我是否需要按提供者的方式处理这个问题? 有没有协议级别的解决scheme奇迹般地让问题消失? 还是OAuth只是不考虑用户体验?

FWIW我正在使用iojspassportjs ,但我认为这与问题没有任何关系。

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

如果我没有明确的范围要求解决问题,请移除此选项。 呜!