我目前正在开发一个 REST-API,它为开发环境提供 HTTP-Basic 保护。由于真正的身份验证是通过令牌完成的,我仍在试图弄清楚如何发送两个授权标头。
我试过这个:
curl -i http://dev.myapp.com/api/users \
-H "Authorization: Basic Ym9zY236Ym9zY28=" \
-H "Authorization: Bearer mytoken123"
例如,我可以为我的 IP 禁用 HTTP 身份验证,但由于我通常在具有动态 IP 的不同环境中工作,这不是一个好的解决方案。所以我错过了什么吗?
400 Bad request
。愚蠢的。
试试这个在 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
。因此,从您的应用程序中捕获该标头下的令牌并处理您需要做的事情。
您可以做的另一件事是,通过 POST
参数传递 token
并从服务器端获取参数的值。例如使用 curl post 参数传递令牌:
-d "auth-token=mytoken123"
标准 (https://www.rfc-editor.org/rfc/rfc6750) 表示您可以使用:
Form-Encoded Body 参数:授权:Bearer mytoken123
URI查询参数:access_token=mytoken123
因此可以通过 URI 传递许多 Bearer Token,但不鼓励这样做(参见标准中的第 5 节)。
如果您在两者之间使用反向代理(例如 nginx),则可以定义自定义令牌,例如 X-API-Token
。
在 nginx 中,您可以将上游代理(您的 rest api)重写为只是身份验证:
proxy_set_header Authorization $http_x_api_token;
...而 nginx 可以使用原始的 Authorization 标头来检查 HTTP AUth。
我有一个类似的问题 - 在设备上验证设备和用户。我在 Authorization: Bearer...
标头旁边使用了 Cookie
标头。一个标头对设备进行身份验证,另一个标头对用户进行身份验证。我使用了 Cookie
标头,因为它们通常用于身份验证。
Cookie
标头已经常用于身份验证。
curl --anyauth 告诉 curl 自己找出身份验证方法,并使用远程站点声称支持的最安全的方法。这是通过首先发出请求并检查响应标头来完成的,因此可能会导致额外的网络往返。这用于代替设置特定的身份验证方法,您可以使用--basic、--digest、--ntlm 和--negotiate 来执行此操作。
使用 nginx,您可以像这样发送两个令牌(即使它违反标准):
Authorization: Basic basic-token,Bearer bearer-token
只要基本令牌在前,这就会起作用 - nginx 成功地将其转发到应用程序服务器。
然后您需要确保您的应用程序可以正确地从上述字符串中提取 Bearer。
还有另一种在开发服务器上测试 API 的解决方案。
仅为 Web 路由设置 HTTP 基本身份验证
让所有 API 路由免于身份验证
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
将保护开发服务器免受网络爬虫和其他不受欢迎的访问者的攻击。
您可以使用带有 x-www-form-url-encoded 的 Body 来发送多个标头。
curl --location --request POST 'http://dev.myapp.com/api/users' \
--header 'Authorization: Basic Ym9zY236Ym9zY28=' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data-urlencode 'access_token=mytoken123'
-v
参数的两个标头运行您的 curl 命令。您会发现它在请求标头处发送Authorization: Basic Ym9zY236Ym9zY28=, Authorization: Bearer mytoken123
。从您的服务器端,如果您检查,您会发现您有这样的授权标头Authorization: Basic Ym9zY236Ym9zY28=, Bearer mytoken123
用逗号分隔。所以,我虽然我应该建议你替代。