基本HTTP和承载令牌认证

Azn*_*eek 105 rest curl restful-authentication basic-authentication access-token

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

我试过这个:

curl -i http://dev.myapp.com/api/users \
  -H "Authorization: Basic Ym9zY236Ym9zY28=" \
  -H "Authorization: Bearer mytoken123"
Run Code Online (Sandbox Code Playgroud)

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

Sab*_*san 63

试试这个在url上推送基本身份验证:

curl -i http://username:password@dev.myapp.com/api/users -H "Authorization: Bearer mytoken123"
               ^^^^^^^^^^^^^^^^^^
Run Code Online (Sandbox Code Playgroud)

如果上面的一个不起作用,那么你就没有任何关系.因此,请尝试以下替代方案.

您可以使用其他名称传递令牌.因为您正在处理来自您的应用程序的授权.因此,您可以轻松地将此灵活性用于此特殊目的.

curl -i http://dev.myapp.com/api/users \
  -H "Authorization: Basic Ym9zY236Ym9zY28=" \
  -H "Application-Authorization: mytoken123"
Run Code Online (Sandbox Code Playgroud)

请注意我已将标题更改为Application-Authorization.因此,从您的应用程序中捕获该标题下的令牌并处理您需要执行的操作.

你可以做的另一件事是,传递token通过POST参数和抓住从服务器端的参数值.例如,使用curl post参数传递令牌:

-d "auth-token=mytoken123"
Run Code Online (Sandbox Code Playgroud)

  • @Azngeek Curl会在您执行任务时发送两个授权标头.您需要从服务器端处理它.只需使用`-v` param两个标题运行你的curl命令.您会发现它在请求标题处发送"授权:基本Ym9zY236Ym9zY28 =,授权:Bearer mytoken123".从你的服务器端,如果你检查,你会发现你有这样的授权标题`授权:基本Ym9zY236Ym9zY28 =,Bearer mytoken123`用逗号分隔.所以,我虽然建议你替换. (5认同)

Jan*_*zak 33

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

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

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


Lac*_*mov 6

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

Authorization: Basic basic-token,Bearer bearer-token
Run Code Online (Sandbox Code Playgroud)

只要基本令牌在前,此操作就有效 - nginx 成功将其转发到应用程序服务器。

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


shr*_*ing 5

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

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

proxy_set_header Authorization $http_x_api_token;
Run Code Online (Sandbox Code Playgroud)

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