javascript - 浏览器中来自 Javascript 的 REST API 身份验证

标签 javascript http rest authentication oauth

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

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

从我一直在看的内容来看,执行此操作的最佳方法似乎实际上是在 HTTPS 连接上使用 HTTP 基本身份验证。我忍不住认为这缺少了一些东西。明显的替代方案似乎是 OAuth 1.0——它要求潜在不安全的 Javascript session 知道客户端 secret ——或 OAuth 2.0——它似乎回到使用 SSL 上的用户名/密码来生成访问 token ,然后使用该访问再次通过 SSL 对 future 请求进行标记,这与 HTTP Basic 基本相同,但有点混淆。

请注意,我在这里没有计算 HTTP 摘要,仅仅是因为 - 据我所知 - 传递给服务器的内容包括不可检索形式的密码(即散列),如果我存储密码在后端也以不可检索的形式出现,那么我无法比较两者......

最佳答案

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

如果获得批准,它应该返回经过身份验证的 token (例如,用户名+密码+ Angular 色+权限+日期时间或其他任何方式的单向哈希函数)。

您的 JS 客户端(通过浏览器)发出的所有后续请求都需要将此 token (将在用户 session 对象中携带,也许在加密的 cookie 中)提交给您正在与之交互的所有 API。 token 可以定时过期,之后用户将被强制重新登录。

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

我可以想象在您的 REST(业务)API 和 REST(登录)API 之间进行某种形式的握手。因此,当您的 REST 业务 API 收到此 token 时,它可能会要求登录 API 验证它是否创建了此 token 以及为哪个用户代理创建的。

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

关于javascript - 浏览器中来自 Javascript 的 REST API 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16368234/

相关文章:

javascript - HTTP header 未通过 fetch() 发送

java - RESTful 服务的时间戳精度问题

javascript - 在 ASP.NET 中运行时更改表单 ID 和表单操作

javascript - 当图层控件移出 map 元素时,不发出 Leaflet-map 单击事件

c# - 从控制台应用程序发布二进制数据

java - 将错误消息作为 JSON 对象发送

javascript - 更改图像映射中不同多边形的标题属性

javascript - javascript 开发者的最佳 ide - dojo 是我的目标

json - 使用模板将 json 输出到 http.ResponseWriter

javascript - Angular 休息 web2py