Google OAuth回调多次追加参数 [英] google oauth callback appending parameters multiple times
问题描述
我们已经成功使用Google OAuth多年了,但它在几天前突然停止工作。在研究这一点时,似乎在用户单击"Allow"以授予对请求的范围的访问权限后,Google将重定向到我们的回调页面(一如既往),但现在代码和范围参数被多次附加到URL中(如下例所示)。给定Web服务器上的查询字符串长度限制,现在会引发404.15的错误。
由于我们最近没有进行任何代码更改,也没有在Google API控制台中进行任何更新,我认为我们没有做任何事情来导致参数被多次追加到回调URL。这是谷歌的问题吗?或者我是否遗漏了可能导致此问题的某些内容?
示例回调URL:
推荐答案
张贴,因为这可能会帮助他人。@fzebra的答案适用于我的情况,但我的身份验证库也将OAuth提供程序发送给我的redirect_uri
的所有查询参数转发给它检索access_token
的请求。正因为如此,也因为我认为Google有一个解析错误,所以新的scope
参数破坏了请求。Google使用400 Bad Request
进行响应,检查JSON响应,得到redirect_uri_mismatch
。我的猜测是他们将他们自己的scope
URL参数视为重定向URI,并使请求无效。
要解决此问题,我需要将scope
查询参数从Google的传出请求中删除,因此我通过URL重写规则完成了此操作。
<!-- See https://stackoverflow.com/questions/52372359/google-oauth-callback-appending-parameters-multiple-times -->
<rule name="Google Login - Remove scope parameter" stopProcessing="true">
<match url="google/redirect/url(.*)?$" />
<conditions trackAllCaptures="true">
<add input="{QUERY_STRING}" pattern="(.*)(&?scope=.+&?)(.*)" />
</conditions>
<action type="Rewrite" url="google/redirect/url?{C:1}{C:3}" appendQueryString="false" />
</rule>
这将从传入的查询字符串中切出scope
参数和值,并在没有它的情况下将这两个部分连接在一起。注意&
是因为这是XML,在普通的正则表达式中,表达式就是(.*)(&?scope=.+&?)(.*)
。在某些情况下,它将留下尾随&
。
您应该将google/redirect/url
替换为您的身份验证URL的路径(Google重定向到该URL)。
您可以在应用层代码中执行此操作,但URL重写不会添加额外的服务器请求👍
这最终解决了它。天哪!
这篇关于Google OAuth回调多次追加参数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!