【问题标题】:google oauth callback appending parameters multiple timesgoogle oauth回调多次附加参数
【发布时间】:2018-09-17 16:44:51
【问题描述】:

我们已经成功使用 Google OAuth 多年了,但它在几天前突然停止工作。在调查这一点后,似乎在用户单击“允许”以授予对所请求范围的访问权限后,Google 正在重定向到我们的回调页面(一如既往),但现在代码和范围参数被附加到 URL多次(下面的示例)。鉴于我们的 Web 服务器上的查询字符串长度限制,现在这会引发 404.15 错误。

由于我们最近没有对代码进行任何更改,也没有在 Google API 控制台中进行任何更新,我认为我们没有做任何事情导致参数被多次附加到回调 URL。这是谷歌的问题吗?还是我错过了可能导致此问题的某些内容?

回调 URL 示例:

http://example.com/oauth/oauthcallback?code=4/XADj4OhPIwWZRA5TsZMgOkMIfmuBVdQidarK_MhSmkpxWubmprbySMBnY4huJaYATwzf8B798OcHLfD-LdBBtfQ&scope=https://googleapis.com/auth/gmail.readonly&code=4/XADj4OhPIwWZRA5TsZMgOkMIfmuBVdQidarK_MhSmkpxWubmprbySMBnY4huJaYATwzf8B798OcHLfD-LdBBtfQ&scope=https://googleapis.com/auth/gmail.readonly&code=4/XADj4OhPIwWZRA5TsZMgOkMIfmuBVdQidarK_MhSmkpxWubmprbySMBnY4huJaYATwzf8B798OcHLfD-LdBBtfQ&scope=https://googleapis.com/auth/gmail.readonly&code=4/XADj4OhPIwWZRA5TsZMgOkMIfmuBVdQidarK_MhSmkpxWubmprbySMBnY4huJaYATwzf8B798OcHLfD-LdBBtfQ&scope=https://googleapis.com/auth/gmail.readonly&code=4/XADj4OhPIwWZRA5TsZMgOkMIfmuBVdQidarK_MhSmkpxWubmprbySMBnY4huJaYATwzf8B798OcHLfD-LdBBtfQ&scope=https://googleapis.com/auth/gmail.readonly&code=4/XADj4OhPIwWZRA5TsZMgOkMIfmuBVdQidarK_MhSmkpxWubmprbySMBnY4huJaYATwzf8B798OcHLfD-LdBBtfQ&scope=https://googleapis.com/auth/gmail.readonly&code=4/XADj4OhPIwWZRA5TsZMgOkMIfmuBVdQidarK_MhSmkpxWubmprbySMBnY4huJaYATwzf8B798OcHLfD-LdBBtfQ&scope=https://googleapis.com/auth/gmail.readonly&code=4/XADj4OhPIwWZRA5TsZMgOkMIfmuBVdQidarK_MhSmkpxWubmprbySMBnY4huJaYATwzf8B798OcHLfD-LdBBtfQ&scope=https://googleapis.com/auth/gmail.readonly&code=4/XADj4OhPIwWZRA5TsZMgOkMIfmuBVdQidarK_MhSmkpxWubmprbySMBnY4huJaYATwzf8B798OcHLfD-LdBBtfQ&scope=https://googleapis.com/auth/gmail.readonly&code=4/XADj4OhPIwWZRA5TsZMgOkMIfmuBVdQidarK_MhSmkpxWubmprbySMBnY4huJaYATwzf8B798OcHLfD-LdBBtfQ&scope=https://googleapis.com/auth/gmail.readonly&code=4/XADj4OhPIwWZRA5TsZMgOkMIfmuBVdQidarK_MhSmkpxWubmprbySMBnY4huJaYATwzf8B798OcHLfD-LdBBtfQ&scope=https://googleapis.com/auth/gmail.readonly&code=4/XADj4OhPIwWZRA5TsZMgOkMIfmuBVdQidarK_MhSmkpxWubmprbySMBnY4huJaYATwzf8B798OcHLfD-LdBBtfQ&scope=https://googleapis.com/auth/gmail.readonly&code=4/XADj4OhPIwWZRA5TsZMgOkMIfmuBVdQidarK_MhSmkpxWubmprbySMBnY4huJaYATwzf8B798OcHLfD-LdBBtfQ&scope=https://googleapis.com/auth/gmail.readonly&code=4/XADj4OhPIwWZRA5TsZMgOkMIfmuBVdQidarK_MhSmkpxWubmprbySMBnY4huJaYATwzf8B798OcHLfD-LdBBtfQ&scope=https://googleapis.com/auth/gmail.readonly&code=4/XADj4OhPIwWZRA5TsZMgOkMIfmuBVdQidarK_MhSmkpxWubmprbySMBnY4huJaYATwzf8B798OcHLfD-LdBBtfQ&scope=https://googleapis.com/auth/gmail.readonly&code=4/XADj4OhPIwWZRA5TsZMgOkMIfmuBVdQidarK_MhSmkpxWubmprbySMBnY4huJaYATwzf8B798OcHLfD-LdBBtfQ&scope=https://www.googleapis.com/auth/gmail.readonly

【问题讨论】:

    标签: callback google-oauth query-string


    【解决方案1】:

    我已经解决了这个问题。如果这对其他人有帮助,则在 2018 年 9 月 12 日至 2018 年 9 月 14 日之间的某个时间,Google 开始在其 OAuth 回调中返回一个附加参数(“范围”)(除了唯一的其他参数 - “代码” -以前在回调中返回)。范围值包括“https://www.googleapis.com”,这导致我们端现有的 URL 重写规则出现问题,以从我们的 URL 中删除“www”。我们的重写规则中非常通用的语法只是查找“www”。导致重定向循环,直到抛出 404.15。通过使重写规则特定于我们的 URL,范围参数将被重写规则忽略并避免重定向循环。

    【讨论】:

    • 这也发生在我身上。虽然现在我解决了这个问题,但看起来谷歌正在重定向回我的应用程序,并在 URL 的最后附加了一个 #,我认为这正在破坏身份验证流程。不知道为什么会出现这种情况。
    【解决方案2】:

    发帖是因为这可能对其他人有所帮助。 @fzebra 的答案适用于我的情况,但我的身份验证库也将 OAuth 提供程序发送到我的redirect_uri 的所有查询参数转发到它为检索access_token 而发出的请求。正因为如此,并且因为我认为 Google 存在解析错误,所以新的 scope 参数会破坏请求。 Google 以 400 Bad Request 响应并检查 JSON 响应,您会得到 redirect_uri_mismatch。我的猜测是他们将 他们自己的 scope URL 参数视为重定向 URI 并使请求无效。

    为了解决这个问题,我需要从向 Google 发出的请求中删除 scope 查询参数,所以我通过 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="(.*)(&amp;?scope=.+&amp;?)(.*)" />
            </conditions>
            <action type="Rewrite" url="google/redirect/url?{C:1}{C:3}" appendQueryString="false" />
        </rule>
    

    这会从传入的查询字符串中删除scope 参数和值,并在没有它的情况下将两个部分重新连接在一起。注意 &amp;amp; 是因为这是 XML,在普通的正则表达式中,表达式只是 (.*)(&amp;?scope=.+&amp;?)(.*)。在某些情况下,它会留下一个尾随 &amp;

    您应该将 google/redirect/url 替换为您的身份验证 URL(Google 重定向到的)的路径。

    您可以在应用层代码中执行此操作,但 URL 重写不会添加额外的服务器请求 ?

    这终于解决了。天哪!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-27
      • 2015-10-05
      • 2021-04-27
      • 1970-01-01
      • 2015-01-30
      • 2012-03-23
      • 2013-08-24
      • 2011-06-29
      相关资源
      最近更新 更多