如果我正确理解 oauth(授权码授予,暂时忽略 pcke),结构有点像这样(如 here 所解释):
客户端重定向到类似的东西:
https://authorization-server.com/auth?response_type=code
&client_id=29352735982374239857
&redirect_uri=https://example-app.com/callback
&scope=create+delete
&state=xcoivjuywkdkhvusuye3kch
然后显示一个身份验证页面并处理这个(简单的用户名+密码形式)。
用户通过身份验证后,oauth 服务器向客户端浏览器发送另一个重定向。然而这次
https://example-app.com/callback
将授权代码作为参数。到目前为止,一切都很好。然而,在阅读上面网址中的解释后,我注意到了这一点:
规范不要求 redirect_uri,但您的服务应该 需要它。此 URL 必须与开发人员的 URL 之一相匹配 创建应用时注册,以及授权服务器 如果不匹配,应该拒绝请求。
它告诉我需要注册 URL - 这对我来说意味着只能有几个“回调 url”。
这让我感到困惑,让我质疑用法:在我们的应用程序中,需要能够随时登录。如果用户在登录后返回到登录页面,那真的是令人困惑/糟糕的用户体验。 - 一个例子是用户正在订购东西并且可以在付款完成之前登录。
是在“state”变量中编码实际 url 的唯一方法吗?这看起来很麻烦而且容易出问题。 (更不用说必须进行编码功能等)。还是有其他我不知道的方法可以做到这一点?
回调 URL 是负责从第三方 OAuth 提供者接受 OAuth 令牌、处理它,然后在用户登录后向用户呈现您想要向他们呈现的任何内容的 URL。
无论您想向他们展示什么,都可以重定向到您网站上的另一个页面。
是在“state”变量中编码实际 url 的唯一方法吗?
state 参数旨在保存一个反 CSRF 令牌。你不应该在那里编码其他数据。
存储您要重定向回其他地方的 URL,例如在服务器端会话中。