在浏览器中使用Javascript进行REST API身份验证

REST API Authentication from Javascript in the browser

本文关键字:进行 REST API 身份验证 Javascript 浏览器      更新时间:2023-09-26

我正在尝试编写一个基于REST的无状态API,我计划从几个不同的地方使用它,其中一个将是单页Javascript web应用程序。这个想法基本上是让不同的客户端使用一个API——包括可能由其他人编写的,但仍然可能需要访问用户数据的客户端——而不是为不同的客户端使用不同的API。

我目前遇到的问题是身份验证。理想情况下,我想在这里使用一些标准的东西,而不是自己制作,但我正在努力找到一些真正适合的标准。我还试图避免根据呼叫方不同而使用不同身份验证机制的解决方案。在这个阶段,我实际上不需要比实际使用应用程序的用户身份验证更多的东西-通过用户名和密码,或类似的-但如果/当客户端不是网页想要使用它时,他们可能也应该进行身份验证。

从我一直在看,似乎最好的方法来做到这一点,实际上只是使用HTTP基本身份验证在HTTPS连接。我不禁认为这是遗漏了一些东西。明显的替代方案似乎是OAuth 1.0 -它要求潜在不安全的Javascript会话知道客户端秘密-或OAuth 2.0 -它似乎回到使用SSL的用户名/密码来生成访问令牌,然后在SSL的未来请求中再次使用该访问令牌,这基本上与HTTP基本相同,但有点模糊。

请注意,我没有计算HTTP摘要在这里,只是因为-正如我所理解的-传递给服务器的是包括密码在一个不可检索的形式(即散列),如果我存储的密码在后端在一个不可检索的形式,那么我不能比较两者…

我将创建一个单独的API来处理用户登录。你的API客户端(一个JS网页)可以通过HTTP Digest + SSL向这个登录API提交用户名/密码。然后,API将对用户存储(数据库或文件等)执行登录,并返回结果-已批准/拒绝访问。

如果被批准,它应该返回一个经过身份验证的令牌(例如,在用户名+密码+角色+权限+日期时间或其他任何内容上的单向哈希函数)。

你的JS客户端(通过浏览器)的所有后续请求将需要提交这个令牌(它将在用户会话对象中携带,也许在加密的cookie中)到你正在与之交互的所有api。该令牌可以设定过期时间,过期后用户将被强制重新登录。

这种方法保持无状态,但有一些问题。如果登录令牌被盗或被用户共享怎么办?在令牌的生存期内,任何拥有令牌副本的人都可以假装是您的用户(中间人)发起查询。SSL应该防止它成为消息的最外层信封。

我可以想象在你的REST(业务)API和REST(登录)API之间做某种握手。因此,当您的REST业务API接收到这个令牌时,也许它可以要求登录API验证它是否创建了这个令牌,以及为什么用户代理创建了这个令牌。

无论如何,对于简单的应用程序,上述方法应该足够了。