【问题标题】:OAuth 2.0 State ParameterOAuth 2.0 状态参数
【发布时间】:2018-10-12 21:53:02
【问题描述】:

我正在使用 OAuth 在我当前的 Meteor 项目应用程序上使用 eBay API。

在应用程序的一部分中,我可以创建一个 eBay 帐户配置文件,并为该帐户分配自定义值(例如给它起昵称等)。这是我启动 OAuth 登录重定向过程的地方。

我的问题是关于令牌请求中的“状态”参数。我知道它是为了帮助防止 CSRF,但我必须那样使用它吗? 'state' 确实毕竟似乎是可选的。

假设我想将另一个值传递给请求调用,例如字符串“eBay Seller”,并期望在响应中返回相同的字符串。我想使用该值来帮助我的应用确定将返回的令牌分配给哪个帐户(基于哪个帐户配置文件启动了重定向链接)。

“状态”是否是传递变量的有效位置,我希望返回的变量与发送时完全一样?我考虑过使用 Session 变量来处理这种情况,但很快意识到这行不通,因为 OAuth 过程将我带到了我的项目域之外。

OAuth 是否支持传递预期以发送方式返回的变量?是否允许甚至推荐将我的变量作为“状态”发送(或绝对不推荐?)有没有更好的方法来实现我想要做的而不涉及更新数据库值?

谢谢!

【问题讨论】:

    标签: oauth-2.0 ebay-api


    【解决方案1】:

    您可以将您想要的内容发送为state。你应该尽量确保它是不可猜测的,以减轻 CSRF 攻击。

    如果您想返回“ebay 卖家”之类的有用信息,请为 CSRF 包含一些内容(例如会话密钥 ID 的哈希)文本“ebay 卖家”并对其进行分隔,例如

    2CF24DBA5FB0A30E26E83B2AC5B9E29E1B161E5C1FA7425E73043362938B9824|ebay seller
    

    现在您拥有两全其美:有用的状态信息 + CSRF 保护。 您的重定向端点逻辑可以检查会话 id 匹配的哈希,还可以从初始请求中确认帐户类型。

    【讨论】:

    • 如果我的应用程序只会被少数受信任的用户使用,我是否还需要处理会话 ID 哈希和所有这些东西?从字面上看,我们在这里所做的一切都是由一群已经了解我们大部分生活的人在内部完成的。我认为 CSRF 攻击将是我们根本不必担心的事情。这不像我会编写自己的代码来对我工作和尊重的公司做恶意的事情。你说我可以发送任何我想要的状态,这回答了这个问题。但是应该我这样做吗?
    • @Ticdoc - 我会说不是,只是因为您对标准字段应用了非标准含义,根据定义,这违反了 OAuth 2 标准。因此,您的应用程序并未完全按照熟悉 OAuth 2 的人所期望的方式遵循 OAuth 2 协议。您不能将您想要的值作为查询字符串参数嵌入到 redirect_uri 值中吗?
    • @EdGraham TIL 重定向 uri 应该是静态的:stackoverflow.com/a/55577647/4400976。正如我今天刚刚学到的那样,它应该没有动态部分。
    猜你喜欢
    • 2020-12-05
    • 2018-04-01
    • 2019-05-13
    • 2016-08-13
    • 1970-01-01
    • 1970-01-01
    • 2017-05-28
    • 2019-11-09
    • 1970-01-01
    相关资源
    最近更新 更多