【问题标题】:file_get_contents(https://...@me): failed to open stream: HTTP request failed! HTTP/1.1 401 Unauthorizedfile_get_contents(https://...@me):打开流失败:HTTP 请求失败! HTTP/1.1 401 未经授权
【发布时间】:2015-02-03 06:01:34
【问题描述】:

我正在开发一个网页,我必须从 API(使用 PHP)获取数据。身份验证工作正常,用户可以登录。为了保存访问令牌,我在 php.ini 中使用了 setcookie() 函数。然而,一段时间后数据消失,我收到以下警告:

Warning: file_get_contents(https://...@me): failed to open stream: HTTP request failed! HTTP/1.1 401 Unauthorized in C:\wamp\www\main.php on line 40

这些是行:

function getUser($access_token){
$url = "https://jawbone.com/nudge/api/v.1.0/users/@me";

$opts = (array(
    'http'=>array(
        'method'=>"GET",
        'header'=>"Authorization: Bearer {$access_token}\r\n"
    )
));

$context = stream_context_create($opts);
$response = file_get_contents($url, false, $context); //

$user = json_decode($response, true);
return $user['data'];
}

实际上这很奇怪,因为当我删除访问令牌 cookie 然后再次登录(并进行身份验证)时它会起作用......我只是不明白为什么会这样。

设置cookie(过期时间为31536000):

 if (!isset($_COOKIE['access_token'])) {
        setcookie('access_token', $data, time() + ($json['expires_in']));
    }

你能告诉我我做错了什么吗?

【问题讨论】:

  • 您的会话可能已过期?
  • 我想过...但是访问令牌的有效期为 1 年
  • 数据从哪里消失?查看您的 http 流量。
  • @symcbean 我是 PHP 新手:如何查看我的 http 流量?
  • 使用数据包嗅探器(例如wireshark)或日志代理(例如proxomitron、firebug、iehttpheaders)

标签: php html http cookies


【解决方案1】:

检查 cookie 的到期日期,即使令牌在 您的 端可能有效,cookie 也可能提前到期。

【讨论】:

  • 我在我的问题中添加了代码...你能看一下吗?
  • 对不起,我删除了我的评论,因为我不太确定你是否真的在使用 jquery。时间是随机的吗?您是否检查过 cookie 在浏览器中的真实外观(它包含哪些过期数据)?
  • time() 函数是实际的系统时间。 cookie 的过期日期为 2016 年(通过 EditThisCookie 检查)。
  • 根据您的回答,我只能得出结论,在 cookie 和执行请求之间,令牌存储在某个本地缓存(php 会话?)中。如果为真,并且它是 php 的会话,请检查您的 php 会话超时。
  • 令牌是用 $_COOKIE 保存的。但是我确实使用了 $_SESSION 但这只是为了检查用户是否登录/退出
【解决方案2】:

也许可以把它拆开一点。从最简单的任务开始,让它发挥作用。所以,假设你需要一个 api 调用,让那个调用工作。如果可行,请继续下一步。

如果 api 调用需要一个秘密令牌,我可以想象你不想只是将它提供给任何用户以将其存储为 cookie。

下一步将是身份验证。如果您不仅是 PHP 新手,而且是一般的 Web 应用程序新手,我会从不太具有挑战性的东西开始。

但是假设您很快就会掌握它,下一步(永远没有最后一步)可能是一个安全决定:用户是否需要进行 api 调用,或者我可以通过一旦用户被授权,做api调用服务器端?

【讨论】:

  • 嗯,问题是这是一个学校项目,遗憾的是我没有足够的时间来掌握它,但我确实花了很多时间试图很好地理解它。安全性很好,但是我不知道应该如何保存令牌。问题是,如果我不保存令牌,用户总是被要求接受/拒绝某些范围(数据读取、更新等),我想这对用户来说很烦人,这就是为什么我把它保存在饼干。
  • 我认为您可以将其存储在 cookie 中,您将其存储在何处以及何时存储?如果您仅在用户登录后存储它,我会检查您的身份验证会话。换句话说:检查你的 php 配置并尝试增加你的会话超时。
猜你喜欢
  • 2011-03-21
  • 1970-01-01
  • 1970-01-01
  • 2016-06-02
  • 2012-03-23
  • 2015-11-21
  • 1970-01-01
  • 2013-01-01
  • 1970-01-01
相关资源
最近更新 更多