【发布时间】:2014-12-28 04:31:17
【问题描述】:
我正在使用PHPoAuthLib 和 GitHub 为我的 PHP Web 应用程序提供一个简单的 OAuth 登录系统。我复制了the example,但遇到了一个问题:浏览器不处理来自 GitHub 的重定向。
我的应用成功重定向到 GitHub 授权页面,如下所示:
GitHub 会生成一个页面,然后在大量标题中包含以下内容:
Location: http://awooga.local/auth?code=5fb910f67xxxxx91003
但是,浏览器不会对此进行处理。起初我认为这是我也在使用的 Slim 框架中的问题。因此我把它删掉了,问题仍然存在。然后我在 GitHub URL 上尝试了wget,发现 GitHub 生成了一个错误页面,其中包括这个非常普遍的错误:
<div id="ajax-error-message" class="flash flash-error">
<span class="octicon octicon-alert"></span>
<a href="#" class="octicon octicon-x flash-close js-ajax-error-dismiss" aria-label="Dismiss error"></a>
Something went wrong with that request. Please try again.
</div>
这可以解释为什么它在浏览器中不起作用——如果 HTML 已发送,您将无法执行 Location 重定向。然而,奇怪的是,如果我将重定向 URL 手动粘贴到我的浏览器中,则表明 身份验证确实有效。因此,据我所知,GitHub 没有理由抱怨问题。
(如果不清楚,http://awooga.local 域在我的机器上工作正常 - 它在本地 DNS 中设置为指向 127.0.0.1)。
This question 听起来很相似,但是在这种情况下有效的解决方案在我的情况下不起作用(而且我看不出它会有什么不同:作者建议 GH 登录 URL 应该是直接链接在应用程序中,而不是重定向)。
发布脚本 1:我想知道 GH 是否发现仅限本地域存在问题。为了测试这个理论,我在/etc/hosts 中用127.0.0.1 条目覆盖了一个真实的域,换掉了凭据,以便它们与GH 上的注册应用程序匹配,然后再次尝试。我得到完全相同的行为:重定向已收到但未执行。我假设正在发生的事情是之前通过 wget 揭示的——HTML 响应中的一个非特定错误正在阻止重定向操作。
发布脚本 2:我已排除 OAuth 库。我在下面使用了一个答案的变体来使用 PHP 中的原始 cURL 操作,这与上面的操作相同——Location 标头被阻碍可能是因为 GH 在 HTML 响应中报告了一个非特定问题。由于我使用 GH 的 /login/oauth/authorize 端点的直接 URL,我看不出可能出了什么问题。然后我从响应中找出位置,将其粘贴到我的浏览器中,它工作正常 - 它从 GitHub 获取访问令牌,然后可用于运行用户调用。我的用户信息全部获取成功。
我正在从 Firefox 添加一些请求/响应标头,以防它有助于阐明问题:
https://github.com/login/oauth/authorize?client_id=xxx&redirect_uri=http://awooga.local/auth2.php
请求:
Host:"github.com"
User-Agent:"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:30.0) Gecko/20100101 Firefox/30.0"
Accept:"text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
Accept-Language:"en-gb,en;q=0.5"
Accept-Encoding:"gzip, deflate"
Referer:"http://awooga.local/auth"
Cookie:"logged_in=yes; <stripped for security>"
DNT:"1"
Connection:"keep-alive"
回复:
Cache-Control:"no-cache, private"
Content-Type:"text/html; charset=utf-8"
Date:"Sat, 27 Dec 2014 19:31:59 GMT"
Location:"http://awooga.local/auth2.php?code=zzz"
Server:"GitHub.com"
Set-Cookie:"user_session=aaa; path=/; expires=Sat, 10-Jan-2015 19:31:59 GMT; secure; HttpOnly
_gh_sess=??; path=/; secure; HttpOnly"
Status:"302 Found"
Strict-Transport-Security:"max-age=31536000; includeSubdomains; preload"
Transfer-Encoding:"chunked"
Vary:"X-PJAX, Accept-Encoding"
X-Content-Type-Options:"nosniff"
X-Frame-Options:"deny"
X-GitHub-Request-Id:"(stripped)"
X-GitHub-Session-Id:"(stripped)"
X-GitHub-User:"halfer"
X-Rack-Cache:"miss"
X-Request-Id:"(stripped)"
X-Runtime:"0.016812"
X-Served-By:"(stripped)"
X-XSS-Protection:"1; mode=block"
content-security-policy:"default-src *; script-src assets-cdn.github.com collector-cdn.github.com; object-src assets-cdn.github.com; style-src 'self' 'unsafe-inline' 'unsafe-eval' assets-cdn.github.com; img-src 'self' data: assets-cdn.github.com identicons.github.com www.google-analytics.com collector.githubapp.com *.githubusercontent.com *.gravatar.com *.wp.com; media-src 'none'; frame-src 'self' render.githubusercontent.com gist.github.com www.youtube.com player.vimeo.com checkout.paypal.com; font-src assets-cdn.github.com; connect-src 'self' ghconduit.com:25035 live.github.com uploads.github.com www.google-analytics.com s3.amazonaws.com"
x-ua-compatible:"IE=Edge,chrome=1"
发布脚本 3:我在我系统上的另一个浏览器 Midori 上尝试了相同的操作,它运行良好。所以它要么是浏览器问题(或者 Midori 很乐意重定向,尽管在重定向回复中收到了 HTML 内容)。
【问题讨论】:
标签: php oauth-2.0 github-api