所以这个问题已经困扰了我一段时间了。请考虑以下情况:
背景:
/login
端点,该端点可重定向到授权URL state
端点生成的/login
参数进行修饰/login
端点会返回Set-Cookie
标头,其中包含state
值(在调用者'浏览器上设置Cookie)state
值仅为userId
情景:
/login
网址,将其重定向到授权网址code
,redirect_url
和state
查询参数,用户ID 现在的问题是:什么阻止Tony使用此数据向/callback
端点发送请求(来自redirect_url
的网址),但将用户ID从state
param更改为某些其他用户ID并代表他做某事?
我唯一想到的是...... Tony将如何知道另一个用户的身份。但是,如果它是公开的 - 那么我应该在这个例子中做些什么来防止这种情况呢?
我希望我的榜样足够清楚。如果没有 - 请问,我会解释在我脑海里发生的事情:)
答案 0 :(得分:1)
在通过http重定向将Tony发送到授权服务器之前,应用程序设置了state参数。它通过URL将状态参数值传递给授权服务器,例如authserver/authorize?state=tony...
应用程序可以创建一个浏览器cookie来将状态值绑定到Tony的浏览器,或者在会话中以其他方式保存它。
现在,当Tony的拦截和修改后的回调网址发布到App,例如app/callback?code=abcd&state=bob...
该请求可能来自Tony的浏览器或其他浏览器,但无论哪种方式,该应用都无法与浏览器会话中的bob
匹配,因为该应用不会在此会话中设置并存储bob
状态。
即使Tony将状态保留为tony
但是从其他浏览器会话调用回调,该应用程序也无法匹配它,因此不会返回令牌。
另请注意,code
只能使用一次。
此外,如果您可以控制应用程序服务器设置的state
,您可以散列用户ID并使用base64ed散列作为state
参数。这样你就无法猜出另一个有效状态。