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

时间:2015-06-22 15:00:18

标签: node.js github oauth passport.js

上下文

我有一个Node.js应用程序,它有一个"复杂的"一组OAuth流程,以使UX更简单。

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

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

example.png

单击"查找您的私人存储库?" 按钮再次针对GitHub对您进行身份验证,询问repo范围。这一切都很好。

问题

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

downgrade.png

问题是用户在登录期间不希望降级,因为没有特殊原因。同样,我不想要求在登录期间获得比我需要的更多权限

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

潜在解决方案

除了两个非解决方案之外,我提出的潜在解决方案是:

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

这很棒,除非它过于有状态,我还没有找到办法做到这一点;它们似乎为每个应用程序用户提供了一个令牌,我怀疑这是OAuth的工作原理,但在很大程度上,我还不是专家。

  • 如果令牌具有比其要求更多的特权,请明确告诉GitHub 不要降级

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

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

另外,这是GitHub特有的问题吗?我是否必须逐个提供商处理此问题?是否存在协议级解决方案奇迹般地解决了问题?或者说OAuth只是没有考虑到UX的构建?

我是否使用iojspassportjs,但我认为这与此问题无关。

1 个答案:

答案 0 :(得分:1)

事实证明,问题出现在我的代码中。我在认证流程中明确设置了一个属性options.scope: [],对于那些使用护照的人),这导致了一个包含&scope=&的GitHub授权URL,这意味着我是明确的要求降级。

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