我目前正在设计一个以 REST API 为中心的多平台应用程序(客户端将包括内部开发的移动应用程序,以及最初的 AJAX 重型 javascript 客户端)。由于将来 API 可能会向第三方开放,因此我正在考虑使用 OAuth 2.0 对 API 进行身份验证和授权。
我正试图解决这种安排的一些安全问题,特别是关于 javascript 客户端的问题。我不希望这个客户端表现得像第三方客户端一样,带有一大堆重定向和弹出窗口等,这是大多数 OAuth 文档似乎关注的内容。由于它将从我自己的域交付,我认为 webapp 的服务器端可以是实际的客户端,并存储客户端机密和刷新令牌,而 javascript 根据需要从服务器检索新的身份验证令牌。
把它一步一步的形式:
- 用户使用非 ajax html 表单登录,生成存储在服务器端的身份验证和刷新令牌。这将设置一个仅限 HTTP 的登录会话 cookie。
- javascript 客户端代码在登录后发送到用户的浏览器。
- javascript 客户端向属于其自己的应用程序(不是 REST api 的一部分)的资源发出请求以检索令牌。会话 cookie 确保客户端是真实的,并且还会检查引用者。返回身份验证令牌。
- javascript 客户端使用 REST API 验证令牌。
- 客户端现在可以使用令牌向 REST API 发出请求,直到它过期。
- 如果身份验证令牌过期或页面关闭并重新打开,javascript 客户端可以请求新令牌。webapp 的服务器端负责刷新令牌并发送新令牌,只要登录会话 cookie 仍然有效。
这有意义吗,还是会在系统中留下巨大的漏洞?特别是,在 Web 上拥有一个基于设置的 cookie 分发身份验证令牌的资源是不是很疯狂?