TL;DR:
不可以,出于安全原因,重定向 URI 必须是静态的。如果客户需要保留state
在授权请求及其异步响应之间,使用 OAuth 2.0state
范围。
长版 :
RFC6749(最初的 OAuth 2.0 规范)已于 2012 年发布,自那时起 OAuth 安全环境已经发生了很大变化。
RFC6819,2013 年的 OAuth 2.0 安全审查 https://www.rfc-editor.org/rfc/rfc6819#section-5.2.3.3已经提到,拒绝动态制作的重定向 uri 是防止 XSS 和客户端模拟攻击的好方法。
OpenID 连接 https://openid.net/specs/openid-connect-core-1_0.html#AuthRequest从 2014 年开始,OAuth 2.0 的常用扩展(具有身份验证功能)已经考虑了该建议,并要求所有重定向 uri 进行精确的字符串匹配。
OAuth 2.0 最佳安全实践的当前建议草案 https://datatracker.ietf.org/doc/html/draft-ietf-oauth-security-topics-12#section-3.1通过强制redirect_uris预注册并要求AS在验证请求中传递的redirect_uri时使用简单字符串比较来确认这一点。因此不得使用动态redirect_uri。
通过使用动态制作的方法,您的客户端使用redirect_uri作为授权请求和响应之间的“状态守护者”,肯定会做出错误的举动SessionID
属性内的redirect_uri。 OAuth2.0为此目的有一个专用的授权请求参数,即“state https://www.rfc-editor.org/rfc/rfc6749#section-4.1.1”。客户端应该使用它。AS 在发出响应时会将该状态附加到redirect_uri 的参数中,以便客户端能够在响应中找到该状态。
正确的授权请求是:
https://youras/authorize?client_id=your_client_id&response_type=code&state=SOMELONGSTATE&redirect_uri=https%3A%2F%2Fsomehost%2Fauthcallback
响应将如下所示:
https://somehost/authcallback?state=SOMELONGSTATE&code=anazcode
这样,redirect_uri 是静态的,因此简单的字符串比较足以在 AS 端验证该 uri。任何比简单字符串比较更复杂的算法都会存在安全缺陷。