我目前正在开发一个REST-API,它为开发环境提供HTTP-Basic保护。由于真正的身份验证是通过令牌完成的,我仍然试图找出,如何发送两个授权头。
我试过这个:
curl -i http://dev.myapp.com/api/users \
-H "Authorization: Basic Ym9zY236Ym9zY28=" \
-H "Authorization: Bearer mytoken123"
我可以为我的IP禁用HTTP身份验证,但由于我通常在具有动态IP的不同环境中工作,因此这不是一个好的解决方案。我错过了什么吗?
答案 0 :(得分:54)
尝试使用此方法在url上推送基本身份验证:
curl -i http://username:password@dev.myapp.com/api/users -H "Authorization: Bearer mytoken123"
^^^^^^^^^^^^^^^^^^
如果上面一个不起作用,那么你与它无关。所以请尝试以下替代方案。
您可以使用其他名称传递令牌。因为您正在处理来自您的应用程序的授权。因此,您可以轻松地将此灵活性用于此特殊目的。
curl -i http://dev.myapp.com/api/users \
-H "Authorization: Basic Ym9zY236Ym9zY28=" \
-H "Application-Authorization: mytoken123"
注意我已将标题更改为Application-Authorization
。因此,从您的应用程序中捕获该标题下的令牌并处理您需要执行的操作。
您可以做的另一件事是,将token
传递给POST
参数,并从服务器端获取参数值。例如,使用curl post参数传递令牌:
-d "auth-token=mytoken123"
答案 1 :(得分:29)
标准(https://tools.ietf.org/html/rfc6750)表示您可以使用:
因此可以通过URI传递许多Bearer Token,但不鼓励这样做(参见标准中的第5节)。
答案 2 :(得分:3)
如果您在两者之间使用反向代理(例如nginx),则可以定义自定义令牌,例如X-API-Token
。
在nginx中,您将其重写为上游代理(您的其余api)仅是auth:
proxy_set_header Authorization $http_x_api_token;
...,而nginx可以使用原始的Authorization标头检查HTTP AUth。
答案 3 :(得分:1)
curl --anyauth
告诉curl自己弄清楚身份验证方法,然后使用 远程站点声称支持的最安全的。这是通过 因此,首先执行请求并检查响应标头 可能导致额外的网络往返。这是用的 而不是设置特定的身份验证方法,您可以 做--basic, - digest,--ntlm和 --negotiate。
答案 4 :(得分:1)
我遇到了类似的问题 - 在设备上验证设备和用户。我在Cookie
标题旁边使用了Authorization: Bearer...
标题。
答案 5 :(得分:1)
还有另一种用于在开发服务器上测试API的解决方案。
HTTP Basic Authentication
nginx
和Laravel
的Web服务器配置如下:
location /api {
try_files $uri $uri/ /index.php?$query_string;
}
location / {
try_files $uri $uri/ /index.php?$query_string;
auth_basic "Enter password";
auth_basic_user_file /path/to/.htpasswd;
}
Authorization: Bearer
将保护开发服务器免受Web爬虫和其他有害访问者的侵害。
答案 6 :(得分:1)
使用nginx,您可以像这样发送两个令牌(即使它违反标准):
Authorization: Basic basic-token,Bearer bearer-token
只要基本令牌是第一个,它就可以工作-nginx成功将其转发到应用程序服务器。
然后,您需要确保您的应用程序可以从上述字符串中正确提取承载。