Rest 基本HTTP和承载令牌身份验证
我目前正在开发一个REST-API,它是为开发环境提供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的不同环
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