【问题标题】:How to pass token in rest API? [duplicate]如何在rest API中传递令牌? [复制]
【发布时间】:2016-05-25 06:43:09
【问题描述】:

我第一次探索 REST API 的世界,我已经不得不通过使用 Slim 来处理它,但现在我想成为一个自制的解决方案,考虑到我不需要任何框架用于制作一个简单的 Rest Api。 我所做的是创建一个这样的页面:

<?php
$method = $_SERVER['REQUEST_METHOD'];
$request = explode("/", substr(@$_SERVER['PATH_INFO'], 1));

switch ($method) 
{
  case 'PUT':
    echo "PUT";
    break;
  case 'POST':
    echo "POST";
    break;
  case 'GET':
    echo "GET";
    break;
  case 'DELETE':
    echo "DELETE";  
    break;
  default:
    handle_error($request);  
    break;
}

我的目标是实现一个访问令牌,我认为在标头中传递它,但我不确定(我正在寻找一种安全模式)。但是,如果我从命令行运行它:

curl -X GET http://localhost/v1

我收到GET,只是为了举例说明它应该如何工作。对于所有其他查询也是如此。现在真正的问题是:如果我传递了一个令牌,我如何才能调用 switch 中的方法?例如,在页面顶部会执行控件会进行这样的检查:

if(!isset($_SERVER['AUTH_USER'])) 
{
    exit('TOKEN not provide');
}

另一个问题是如何通过 curl 传递令牌?因为如果我通过... 我可以通过 curl 读取标题,但它是如何工作的?

更新:

正如@Paradoxis 所述,我已经尝试过:

url http://localhost/v1 -H "Authorization: <token>"

但似乎我没有采取标题。我花时间了解为什么标题没有通过,所以在我的代码中我添加了这一行:

print_r(apache_request_headers());

结果如下:

Array 
(
   [Host] => localhost
   [User-Agent] => curl/7.46.0
   [Accept] => */*
   [Authorization] => <token>
)

您如何在request_headers 中看到我可以在标题中正确看到,但我无法通过使用$_SERVER['Authorization']$_SERVER['HTTP_Authorization'] 来捕捉它

【问题讨论】:

  • 投票以重复关闭。很难只选择 1 个帖子,因为这个话题在 SO 上讨论得非常频繁。表明作者缺乏研究努力。此外,“真正的问题”只出现在帖子的末尾。不相信这可以或应该被挽救。没有DOWNVOTE。
  • @tonygil 好吧,我想我的问题与您的建议略有不同,抱歉您没有理解。
  • 这听起来像meta.stackexchange.com/questions/66377/what-is-the-xy-problem 你到底想做什么?因为您似乎将标准 http 身份验证与基于“自定义”令牌的身份验证(如 Oauth 或许多其他)混合在一起
  • @Gavriel 嗨,这不是 xy 问题。我想实现在每个 API 请求中传递的令牌访问。当然token是自定义的,不知道这样对不对。

标签: php rest curl


【解决方案1】:

您可以通过 -H 参数传递带有 curl 的标题,如下所示:

curl http://localhost/v1 -H "AUTH_USER: <token>"

【讨论】:

  • 好的,现在很清楚了。如果我执行你的命令:var_dump( $_SERVER['AUTH_USER']); 我得到Null。为什么?
  • @Dillinger 你做过var_dump($_SERVER) 吗?如果我没记错的话,您的情况下的标头将带有前缀,例如 $_SERVER['HTTP_AUTH_USER']) 尽管该特定的标头可能会保留用于 HTTP 身份验证。
  • 我这样设置令牌:curl -X GET http://localhost/v1/ -H "AUTH_USER: &lt;my token&gt;" 我也尝试过:var_dump($_SERVER['HTTP_AUTH_USER'])
  • @Dillinger HTTP_AUTH_USER 可能已保留。
【解决方案2】:

您如何在 request_headers 中看到我可以在 标头,但我无法通过使用 $_SERVER['Authorization'] 或 $_SERVER['HTTP_Authorization']

每次您需要查看标题,甚至是您认为应该可用的任何其他信息时,我建议您像这样调试它:

var_dump($_SERVER);

您很可能会发现它是:$_SERVER['HTTP_AUTHORIZATION']

注意:这是区分大小写的! Php 获取标题,将密钥大写,将“-”更改为“_”并在前面添加“HTTP_”。

注意 2:不要使用标准的 http 标头,例如 Authorization 用于您的自定义令牌。那是给HTTP Basic Authentication。如果您确实实现了自定义令牌,请使用您的自定义 http 标头。

【讨论】:

  • 您建议使用什么作为身份验证令牌?
  • 我没有说值,只是标题的名称。你可以使用Token:例如
  • 我的意思是,您建议使用标头作为访问令牌或其他技术?无论如何,我做了一个var_dump($_SERVER);,并且有一个这样的索引:['AUTHORIZATION'] =&gt; string(6) "master" 。现在,如果我尝试将其设为 var_dump($_SERVER['AUTHORIZATION']);var_dump($_SERVER['HTTP_AUTHORIZATION']);,我会得到 NULL。我不明白为什么。
  • 我注意到,如果我在 .htaccess 中添加此 RewriteRule .? - [E=AUTHORIZATION:%{HTTP:AUTHORIZATION}],我可以正确获取 AUTHORIZATION 标头,但如果没有它,$_SERVER 变量中的标头将不会被评估。
  • 这可能是因为您尝试使用具有标准含义的 http 标头。试试Token
猜你喜欢
  • 2019-07-25
  • 2021-04-29
  • 2022-08-24
  • 2019-12-19
  • 2019-10-28
  • 2016-04-17
  • 1970-01-01
  • 2021-09-02
  • 1970-01-01
相关资源
最近更新 更多