授权头行为的澄清

3
我正在为一个练习网站编写身份验证机制。我已经成功创建了安全令牌,但是我希望在登录后的每个请求中都发送它以进行授权。
我希望将其设置为Authorization Header,但是我认为如果用户通过浏览器栏访问URL,则不会设置标头。
如何让客户端记住每次访问我的域名时都要发送Authorization header?
另外,我不想将令牌作为cookie发送。
简而言之:
我有几个关于Authorization Header行为的问题:
1.是否需要在每个请求中发送Authorization Header,还是浏览器会自动执行?
2.如果不是自动执行,在浏览器栏中进行的用户输入的GET请求永远不会被验证,因为没有任何JavaScript可以附加Header,您将如何解决此问题,而不使用cookies?(页面重定向?)
3.如果我需要在每个请求中发送Authorization header,最好的解决方案是什么?
PS
我正在使用JavaScript,没有任何框架。

你使用哪种身份验证方式?是 BasicDigest 还是 OAuth2.0 的 Bearer?根据你在 @Veselin 的回答中的评论,我猜测应该是 Bearer。只是为了确认一下。 - shaochuancs
目前我还没有实现任何东西,但我想要实现Bearer。另外,我想要补充一下,我正在使用vanillaJS,没有框架。 - Shravan S
对于 BasicDigest,浏览器会自动发送 Authorization 头。请检查我的答案。不幸的是,对于 Bearer,我在相应的 RFC 中没有找到任何有趣的描述。 - shaochuancs
2个回答

1
对于基本认证和摘要认证中的“授权”头部,回答您的问题如下:
“如何让客户端记住每次访问我的域名都发送授权头部?”
只要符合RFC2617规范,客户端将自动记住并发送授权头部:
一个客户端应该假定请求URI路径字段中最后一个符号元素深度及其以下所有路径都在当前挑战的基本领域值指定的保护空间内。客户端可以在未收到服务器的另一个挑战之前预先发送相应的授权头部,以请求该空间中的资源。(2基本认证方案)

...

客户端应该记住与身份验证会话相关的用户名、密码、nonce、nonce计数和模糊值,以便在该保护空间内使用这些信息构造未来请求中的Authorization标头。(3.3摘要操作)

"我需要在每个请求中发送Authorization标头吗?还是浏览器会自动处理?"

浏览器会自动处理。

对于Bearer身份验证(OAuth 2.0)中的Authorization标头,我搜索了RFC6750,但没有找到任何类似的描述。


我将进一步研究这些领域,仍不清楚如何使标题能够“自动”从本地存储中获取数据。访问令牌的本地存储键是否也必须遵循某些预定义的方案? - Shravan S
对于BasicDigest,您不需要做任何事情。它与localStorage无关。 "自动"行为是RFC规范所要求的。 - shaochuancs
“浏览器会自动执行这个操作”显然是不正确的。浏览器会自动发送cookie,但不会发送授权头信息。我们有一个网站,用户无法访问图片,因为浏览器不会自动发送授权头信息,我们必须在每个请求中手动设置它。 - JeneralJames

0

我会尽力回答你的问题。

  1. 如果您想要验证用户身份,每个请求都需要发送授权头。您可以在此链接了解更多关于授权头的信息。

  2. 我不理解这个问题。例如,如果您在浏览器地址栏中输入www.facebook.com,则会进入Facebook主页。如果用户没有令牌,则显示登录页面或重定向到www.facebook.com/login。如果用户有令牌,则转到主页并在标题中发送令牌。Facebook将令牌存储在cookie中,您可以将其存储在Locale存储中。

  3. 什么是最好的方法?在成功登录后,API会给我一个令牌,我将其保存到本地存储中。然后,在每个请求中,我都会发送令牌。如果数据库中的令牌与令牌相同,则获取数据。如果数据库中的令牌与令牌不同,则重定向到登录页面。

希望这回答了你的问题。


在你的第二个回答中,你说如果用户有令牌,facebook.com会将你发送到你的Facebook主页。但是令牌是通过授权标头发送的,授权标头需要通过JavaScript(header.Set)设置。我的问题是当用户从浏览器栏访问时,facebook.com如何接收令牌?谢谢! - Shravan S
好的,这种行为对于“cookies”是有效的,我完全同意。我想知道您如何在没有cookies的情况下使用授权头来管理它?提前致谢!(授权:Bearer Token) - Shravan S
你需要将那个令牌存储在某个地方。同时查看这个链接:https://medium.com/@robert.broeckelmann/how-to-submit-your-security-tokens-to-an-api-provider-pt-1-4a68df35843a。 还可以查看这个链接:https://jwt.io/introduction/。 - Veselin Kontić

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接