基本 HTTP 和承载令牌认证

我目前正在开发一个 REST-API,它是针对开发环境的 HTTP-Basic 保护的。由于真正的身份验证是通过令牌完成的,因此我仍在试图弄清楚如何发送两个授权头。

我试过这个:

curl -i http://dev.myapp.com/api/users \
-H "Authorization: Basic Ym9zY236Ym9zY28=" \
-H "Authorization: Bearer mytoken123"

例如,我可以为我的 IP 禁用 HTTP-Authentication,但是由于我通常在不同的环境中使用动态 IP,所以这不是一个好的解决方案。我错过了什么吗?

430254 次浏览

试试这个方法,在 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,并从 Server 端获取参数值。例如,使用 curl post 参数传递令牌:

-d "auth-token=mytoken123"

Curl... Anauth

告诉 curl 自己找出身份验证方法,并使用 最安全的一个远程站点声称支持。这是由 首先执行请求并检查响应头,因此 可能导致额外的网络往返 而不是设置特定的身份验证方法 处理——基本的、——消化的、—— ntlm 和 谈判。

标准(https://www.rfc-editor.org/rfc/rfc6750)说你可以使用:

  • 表单编码的主体参数: 授权: 持有者 mytoken123
  • URI 查询参数: Access _ token = mytoken123

因此,可以使用 URI 传递许多承载令牌,但是不鼓励这样做(请参阅标准中的第5部分)。

我也遇到过类似的问题——在设备上验证设备和用户。我在 Authorization: Bearer...头旁边使用了一个 Cookie头。一个头验证了设备,另一个头验证了用户。我使用了 Cookie标头,因为这些标头通常用于身份验证。

如果在两者之间使用 nginx 这样的反向代理,则可以定义自定义令牌,如 X-API-Token

在 nginx 中,你可以重写它,让上游代理(你的其他 API)只是 auth:

proxy_set_header Authorization $http_x_api_token;

... 而 nginx 可以使用原始的授权头来检查 HTTP AUth。

在开发服务器上测试 API 还有另一种解决方案。

  • 仅为网络路由设置 HTTP Basic Authentication
  • 保留所有 API 路由不受身份验证的限制

nginxLaravel的 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将负责保护开发服务器免受网络爬虫和其他不受欢迎的访问者的攻击。

使用 nginx,您可以像下面这样发送两个令牌(尽管它违反了标准) :

Authorization: Basic basic-token,Bearer bearer-token

只要基本令牌是 first-nginx 就可以成功地将其转发到应用服务器。

然后,您需要确保您的应用程序能够正确地从上面的字符串中提取承载者。

您可以使用带有 x-www-form-url 编码的 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'