基本的HTTP和承载令牌认证


115

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

我已经尝试过这个了:

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

例如,我可以为我的IP禁用HTTP身份验证,但是由于我通常在具有动态IP的不同环境中工作,所以这不是一个好的解决方案。那我错过了什么吗?


2
我需要通过HTTP Basic进行身份验证,因为开发服务器受到它的保护,并且我需要基于令牌的api身份验证。但是当我使用curl来测试api时,我需要一种发送两个身份验证标头的方法。因此,第一个(基本)传递HTTP Basic,第二个(令牌)传递给我的应用程序身份验证。是的,这是我自己的创造。
Azngeek

1
你曾经想过吗?我加入悬赏
亚当韦特

4
你好亚当,不幸的是没有。现在,我通过将令牌的授权标头更改为“ x-auth”(不是标准标头)来更改了身份验证的方式。
Azngeek

1
我的Nginx服务器甚至不接受2个Authorization标头。它返回一个400 Bad request。愚蠢。
Rudie 2015年

1
为API令牌使用自定义标头有什么问题?我不明白为什么这里的人使用HTTP Basic Auth来“废弃”,以使其开发/登台服务器远离窥视。
Sunil D.

Answers:


68

尝试使用此方法将基本身份验证推送到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
您好Sabuj,问题不是您传递用户名和密码的方式,而是多个授权标头不起作用。查看规格(ietf.org/rfc/rfc2617.txt),我可以看到这是可能的。但是也请注意,““用户代理必须选择使用其了解的身份验证方案最强的挑战之一,并根据该挑战向用户请求凭据。”因此,就像我两天前写的那样,我需要通过非标准标头的令牌,当您处理非标准体系结构时绝对没问题
Azngeek 2014年

5
当您执行任务时,@ Azngeek Curl会发送两个授权标头。您需要从服务器端处理它。只需使用带有-vparam的两个标头运行curl命令即可。您会发现它Authorization: Basic Ym9zY236Ym9zY28=, Authorization: Bearer mytoken123在请求标头中发送。在服务器端,如果进行检查,则会发现您拥有Authorization标头,这种方式Authorization: Basic Ym9zY236Ym9zY28=, Bearer mytoken123用逗号分隔。因此,尽管我建议您选择其他人。
2014年


4

如果在两者之间使用反向代理(例如nginx),则可以定义自定义标记,例如X-API-Token

在nginx中,您可以将其重写为上游代理(您的其余api)仅是auth:

proxy_set_header Authorization $http_x_api_token;

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


3

我有一个类似的问题-验证设备和设备上的用户。我在Cookie标题旁边使用了Authorization: Bearer...标题。


还不清楚为什么要下票。我碰到了这个问题,正在寻找相关问题的答案-这就是我解决的方法。该Cookie头已频繁用于验证。
Iiridayn

2

卷曲--anyauth

告诉curl自己找出认证方法,并使用远程站点声称支持的最安全的一种。首先执行请求并检查响应标头,从而可能导致额外的网络往返。使用此方法代替设置特定的身份验证方法,可以使用--basic,--digest,--ntlm和--negotiate进行设置。


1

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

  • HTTP Basic Authentication仅针对网络路线设置
  • 保留所有API路由免于身份验证

为Web服务器配置nginxLaravel会是这样的:

    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爬虫和其他有害访问者的侵害。


0

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

Authorization: Basic basic-token,Bearer bearer-token

只要基本令牌是第一个,它就可以工作-nginx成功将其转发到应用程序服务器。

然后,您需要确保您的应用程序可以从上述字符串中正确提取承载。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.