【问题标题】:file_get_contents not working with bearerfile_get_contents 不适用于承载
【发布时间】:2018-01-06 15:36:10
【问题描述】:

我不断收到此错误

警告:file_get_contents 未能打开流:HTTP 请求 失败的! HTTP/1.1 401 未经授权

代码

$url = BASE_URL . 'api/v1/users';
$options = array('http' => array(
    'method'  => 'GET',
    'header' => 'Authorization: Bearer '.$token
));
$context  = stream_context_create($options);
$response = file_get_contents($url, false, $context);

我与我的 api 一起使用的中间件通过 url 参数或标头接受授权;

如果我在参数中使用令牌,它可以工作但无法通过服务器上的标头发送它,导致在本地主机上它工作,

请求是通过不记名令牌授权的,我没有任何用户名和密码来授权请求​​,如下所示,我只在我的 url 参数中使用令牌。

知道为什么吗?如果不更改所有对 curl 的请求,我该怎么办

$result = file_get_contents(BASE_URL . 'api/v1/users?authorization='.$token, false);
$response = json_decode($result, true);

【问题讨论】:

标签: php slim middleware


【解决方案1】:

我发现这是影响标头授权的 apache 和 php 服务器配置,我能够使用 .htaccess 覆盖它

我在 .htaccess 中添加了这一行

SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1

【讨论】:

    【解决方案2】:

    您可以将标题添加到 file_get_contents,它需要一个名为 context 的参数,可用于此:

    $url = BASE_URL . 'api/v1/users';
    $options = array('http' => array(
        'method'  => 'GET',
        'header' => 'Authorization: Bearer '.$token
    ));
    $context  = stream_context_create($options);
    $response = file_get_contents($url, false, $context);
    

    【讨论】:

    • 我不明白你改了什么?
    • 当你传入 curl 时,我已经传递了标题,所以它得到了承载,错误被删除
    • 我只是将我的代码与您在diffchecker 上的代码进行比较,它的代码 100% 相同,并且在服务器上尝试过,没有任何改变
    【解决方案3】:

    您的问题可能与您的授权有关,您知道服务器中的授权类型吗?

    您的类型可能必须是 cn389ncoiwuencr,请从服务器上说一下并尝试:

    'header' => 'Authorization: Bearer cn389ncoiwuencr '.$token
    

    【讨论】:

    【解决方案4】:

    您可以使用CURL 提出请求

     $opts = array(
                    'http'=>array(
                        'method'=>"GET",
                        'header'=>"Content-Type: application/json en\r\n" .
                        "Authorization: Token ".$token."\r\n"
                    )
                );
    
    $response = file_get_contents($Base_URL."?format=json", false, stream_context_create($opts));
    
    echo $response;
    

    【讨论】:

    • 在不将我所有的代码迁移到 curl 的情况下有没有解决方案?
    • 我做了,现在错误没有出现,但是数据没有被检索到,ps:我在本地主机和服务器上都使用php 7,但在本地主机上它可以工作
    • 我只是尝试调用一个不需要身份验证的端点,当我删除标头授权承载时它可以工作,这是否意味着 file_get_content 工作正常?
    • 我不明白您建议的代码与我发布的代码完全一样,没有什么不同?
    • @VarunMalhotra 您是从哪里得知这已被弃用的? php.net/manual/en/function.file-get-contents.php 没有这方面的内容。
    猜你喜欢
    • 2011-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-26
    • 2017-12-18
    • 2013-03-20
    • 1970-01-01
    相关资源
    最近更新 更多