64

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

我已经试过这一个:

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

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

+0

通过http进行身份验证有许多方法(不要与authirization混淆)。你是usibg某种框架还是这是你自己的创作?为什么你需要两个授权标题? – plc

+1

我需要通过HTTP Basic进行身份验证,因为Dev服务器受到它的保护,我需要基于令牌的api验证。但是当我使用curl来测试api时,我需要一种发送两个身份验证头的方法。所以第一个(基本)通过HTTP基本和第二个(令牌)认证我的应用程序。是的,这是我自己的创作。 – Azngeek

+1

你有没有想过这个?我添加了一个赏金 –

回答

37

试试这个在URL推动基本身份验证:

curl -i http://username:[email protected]/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参数,并从服务器端获取参数的值。例如通过令牌卷曲之后的参数:

-d "auth-token=mytoken123" 
+0

你好Sabuj,问题不在于你如何通过用户名和密码,但多个授权头只是不工作。看规格(https://www.ietf.org/rfc/rfc2617.txt)我可以看到这应该是可能的。但正如也表示“”用户代理必须选择使用 最强的认证方案之一的挑战,它根据该挑战了解并请求来自 用户的凭证。“就像我2天前写的,我需要将标记传递给一个非标准的标题,这在处理非标准体系结构时是绝对没问题的 – Azngeek

+4

@Azngeek Curl会在你执行任务时发送两个授权标题,你需要从你的服务器端处理它,你的curl命令的两个头部都带有'-v'参数,你会发现它在请求头部发送'Authorization:Basic Ym9zY236Ym9zY28 =,Authorization:Bearer mytoken123'。从服务器端,如果你检查,你会发现你有这样的授权标题'Authorization:Basic Ym9zY236Ym9zY28 =,Bearer mytoken123'用逗号隔开,所以我应该建议你交替。 –

1

卷曲--anyauth

告知卷曲本身弄清楚身份验证方法,并使用 最安全的一个远程站点宣称支持。这是通过 首先执行请求并检查响应头,因此 可能引起额外的网络往返。这用于 而不是设置特定的验证方法,您可以使用 对--basic, - digest,--ntlm和 - 进行协商。

22

标准(https://tools.ietf.org/html/rfc6750)说,你可以使用:

  • 表单编码的车身参数:授权:承载mytoken123
  • URI查询参数:的access_token = mytoken123

所以有可能通过URI传递许多持票人令牌,但这样做是不鼓励的(见se标准中的第5点)。