Rest 基本HTTP和承载令牌身份验证

Rest 基本HTTP和承载令牌身份验证,rest,curl,basic-authentication,access-token,restful-authentication,Rest,Curl,Basic Authentication,Access Token,Restful Authentication,我目前正在开发一个REST-API,它是为开发环境提供HTTP基本保护的。由于真正的身份验证是通过令牌完成的,所以我仍在试图弄清楚如何发送两个授权头 我试过这个: curl -i http://dev.myapp.com/api/users \ -H "Authorization: Basic Ym9zY236Ym9zY28=" \ -H "Authorization: Bearer mytoken123" 例如,我可以禁用我的IP的HTTP身份验证,但由于我通常在使用动态IP的不同环

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

我试过这个:

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

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

试试这个,在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"
请注意,我已将标题更改为
应用程序授权
。因此,从应用程序中捕获该头下的令牌,并处理您需要执行的操作

您可以做的另一件事是,通过
POST
参数传递
token
,并从服务器端获取参数的值。例如,使用curl post参数传递令牌:

-d "auth-token=mytoken123"
curl--anyauth

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

标准()说明您可以使用:

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

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

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

如果您使用的是反向代理,例如中间的nginx,则可以定义自定义令牌,例如
X-API-token

在nginx中,您将重写它,使上游代理(您的restapi)仅为auth:

proxy_set_header Authorization $http_x_api_token;

。。。虽然nginx可以使用原始授权头来检查httpauth。

还有另一种解决方案用于在开发服务器上测试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
将负责保护开发服务器免受网络爬虫和其他不必要的访问者的攻击。

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

只要基本令牌是第一个,这就可以工作——nginx成功地将其转发到应用服务器


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

我需要通过HTTP Basic进行身份验证,因为Dev服务器受到HTTP Basic的保护,我需要api的基于令牌的身份验证。但是,当我使用curl测试api时,我需要一种方法来发送两个身份验证头。因此,第一个(basic)传递HTTP basic,第二个(token)传递给我的应用程序进行身份验证。是的,这是我自己创造的。你知道吗?我加了一笔赏金,你好,亚当,不幸的是没有。我现在已经改变了身份验证的工作方式,将令牌的授权头更改为“x-auth”,这不是一个标准头。我的nginx服务器甚至不接受2个授权头。它返回一个
400错误请求
。愚蠢。为API令牌使用自定义头有什么不对?我不明白为什么这里的人“放弃”使用HTTP Basic Auth来让他们的开发/登台服务器远离窥探者。你好,Sabuj,问题不在于你如何传递用户名和密码,而是多个授权头根本不起作用。查看规范()我可以看出这应该是可能的。但也如前所述,“用户代理必须选择使用其理解的最强身份验证方案的其中一个挑战,并根据该挑战向用户请求凭据。“就像我两天前写的那样,我需要将令牌传递给一个非标准头,这在处理非标准体系结构时是完全可以的。@Azngeek Curl在执行任务时会发送两个授权头。您需要从服务器端处理它。只需使用
-v
参数对两个标题运行curl命令。您会发现它的发送
授权:Basic Ym9zY236Ym9zY28=,授权:Bearer mytoken123
在请求头。在服务器端,如果您进行检查,您会发现您的授权头是这样的
Authorization:Basic Ym9zY236Ym9zY28=,Bearer mytoken123
,用逗号分隔。所以,我想我应该建议你做候补。不清楚为什么要投否决票。我在寻找一个相关问题的答案时遇到了这个问题——我就是这样解决的。
Cookie
头已经经常用于身份验证。我认为有些人的问题是,他们和我一样,不知道你以Cookie的形式发送什么-与头相同,或者只是一个令牌或其他任何东西?
Authorization: Basic basic-token,Bearer bearer-token