将OAuth令牌通信到javascript客户端的安全方法

将OAuth令牌通信到javascript客户端的安全方法,javascript,ajax,rest,oauth,oauth-2.0,Javascript,Ajax,Rest,Oauth,Oauth 2.0,目前,我正在设计一个以RESTAPI为中心的多平台应用程序(客户端将包括内部开发的移动应用程序,最初是一个使用AJAX的javascript客户端)。因为将来API可能会对第三方开放,所以我正在考虑使用OAuth 2.0对API进行身份验证和授权 我正试图通过这种安排解决一些安全问题,特别是关于javascript客户端的问题。我不希望这个客户机像第三方客户机那样,有一大堆重定向、弹出窗口等等,这是大多数OAuth文档关注的。由于它将从我自己的域中交付,我认为webapp的服务器端可以是实际的客

目前,我正在设计一个以RESTAPI为中心的多平台应用程序(客户端将包括内部开发的移动应用程序,最初是一个使用AJAX的javascript客户端)。因为将来API可能会对第三方开放,所以我正在考虑使用OAuth 2.0对API进行身份验证和授权

我正试图通过这种安排解决一些安全问题,特别是关于javascript客户端的问题。我不希望这个客户机像第三方客户机那样,有一大堆重定向、弹出窗口等等,这是大多数OAuth文档关注的。由于它将从我自己的域中交付,我认为webapp的服务器端可以是实际的客户端,并存储客户端机密和刷新令牌,而javascript根据需要从服务器检索新的auth令牌

要以逐步的形式进行:

  • 用户使用非ajax html表单登录,生成存储在服务器端的身份验证和刷新令牌。这将设置仅HTTP登录会话cookie
  • javascript客户端代码在登录后发送到用户的浏览器
  • javascript客户端向属于其自身应用程序(不是RESTAPI的一部分)的资源发出请求以检索令牌。会话cookie确保客户端是真实的,并且还将检查referer。将返回身份验证令牌
  • javascript客户端使用RESTAPI验证令牌
  • 客户机现在可以使用令牌对RESTAPI发出请求,直到其过期
  • 如果auth令牌过期或页面关闭并重新打开,javascript客户端可以请求一个新令牌。只要登录会话cookie仍然有效,webapp的服务器端负责刷新令牌并发送新令牌

  • 这有意义吗,还是会在系统中留下巨大的漏洞?特别是,在Web上有一个资源,它基于一个cookie设置认证令牌?

    < p>确保任何与浏览器的通信都是HTTPS,这样中间没有人可以窃取您的令牌。并在身份验证cookie上设置“安全”标志

    • 现在大多数浏览器授权方案归结为在cookie中传递的会话令牌。OAuth2方案领先了两步,因为a)令牌(可以)是没有危险用户信息的哑令牌,b)它们过期

    • (仅将该评论放在上下文中:有一次,我从一个站点打开一个会话令牌,发现我的家庭地址和电话号码在其中。Ack!)

    • 我见过在BrowerJavaScript中对请求进行HMAC签名的代码,但它附带了一个巨大的免责声明:不要在生产中使用它。签名方案要求客户端(javascript)知道一个“秘密”字符串,但浏览器/javascript是如此不安全,以至于它等于将您的秘密字符串交给了全世界


    但是,如果您通过HTTPS保持所有通信,那么您实际上只是在将会话令牌作为cookie传递的熟悉方案上施加了OAuth扭曲。

    我本来打算对所有内容使用SSL,我应该已经提到了。我同意这个答案,并且正在考虑实施这种方法,但还有另一种方法值得一提。您可以使用JavaScript的“隐式”授权,然后使用访问令牌回拨web应用程序以生成会话cookie。从那时起,会话cookie(绑定到服务器端的访问令牌)将用于针对web应用进行身份验证,而访问令牌将用于针对REST API进行身份验证。但是,在这里如何处理刷新令牌(可能将其存储在本地存储中,如果可用的话?)。