基本HTTP和承载令牌认证

时间:2014-03-06 16:16:15

标签: rest curl basic-authentication access-token restful-authentication

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

我试过这个:

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

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

7 个答案:

答案 0 :(得分:54)

尝试使用此方法在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 :(得分:29)

标准(https://tools.ietf.org/html/rfc6750)表示您可以使用:

  • 表格编码的身体参数:授权:Bearer mytoken123
  • URI查询参数: access_token = mytoken123

因此可以通过URI传递许多Bearer Token,但不鼓励这样做(参见标准中的第5节)。

答案 2 :(得分:3)

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

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

proxy_set_header Authorization $http_x_api_token;

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

答案 3 :(得分:1)

  

curl --anyauth

     

告诉curl自己弄清楚身份验证方法,然后使用   远程站点声称支持的最安全的。这是通过   因此,首先执行请求并检查响应标头   可能导致额外的网络往返。这是用的   而不是设置特定的身份验证方法,您可以   做--basic, - digest,--ntlm和   --negotiate。

答案 4 :(得分:1)

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

答案 5 :(得分:1)

还有另一种用于在开发服务器上测试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将保护开发服务器免受Web爬虫和其他有害访问者的侵害。

答案 6 :(得分:1)

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

Authorization: Basic basic-token,Bearer bearer-token

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

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