Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/473.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript中的安全OAuth_Javascript_Security_Oauth_Oauth Provider_Browser Extension - Fatal编程技术网

Javascript中的安全OAuth

Javascript中的安全OAuth,javascript,security,oauth,oauth-provider,browser-extension,Javascript,Security,Oauth,Oauth Provider,Browser Extension,我有一个api,它使用OAuth 1.0a来验证使用它的应用程序。它正在取代一个旧的api,该api使用了大量的定制和hodge podge调用,这些调用都被弃用 众所周知,OAuth 1.0a在(客户端)Javascript中是不安全的,因为它依赖于保密的消费者机密。这是不可能的,因为源始终可见 我们有用于Chrome、Firefox、IE和Safari的浏览器扩展,将来需要使用此api。这些扩展大部分或全部用Javascript编写,因此存在安全问题 这些扩展是内部的,因此可以使用自定义的身

我有一个api,它使用OAuth 1.0a来验证使用它的应用程序。它正在取代一个旧的api,该api使用了大量的定制和hodge podge调用,这些调用都被弃用

众所周知,OAuth 1.0a在(客户端)Javascript中是不安全的,因为它依赖于保密的消费者机密。这是不可能的,因为源始终可见

我们有用于Chrome、Firefox、IE和Safari的浏览器扩展,将来需要使用此api。这些扩展大部分或全部用Javascript编写,因此存在安全问题

这些扩展是内部的,因此可以使用自定义的身份验证方法来获取访问令牌

我计划实施的内容如下:

  • 用户在浏览器中登录网站
  • 该网站向他们发布一个带有会话密钥的cookie
  • 然后,我们的扩展将该cookie传递给api
  • api验证它是否是有效的活动会话,并向扩展发出访问令牌
  • 这些代币在到期前最长可使用一小时
  • javascript发布的cookie也将有较低的速率限制
它在以下假设下运行:

  • 如果另一个应用程序可以访问您的cookie,那么他们无论如何都可以在网站上模拟您,因此访问api也不例外
  • 所有身份验证方法仍由我们控制
  • 令牌的定期到期意味着,如果它们被破坏,那么利用它们的时间是有限的
我的问题是,这是限制访问api的安全方法吗? 有更好的吗

几个音符。 我知道一个事实,chrome extensions可以请求允许访问给定站点的Cookie。我相信firefox扩展也可以做到这一点


显然,我们不希望在任何页面上通过javascript访问Cookie,否则我们将面临XSS攻击,因此它们只需要通过扩展访问。

我编写了一个站点,该站点通过OAuth的javascript库登录OAuth。这是工作流程:

  • OAuth仅在具有本地存储的浏览器上受支持
  • 登录表单将检查本地存储中的OAuth密钥,如果存在OAuth密钥,则自动尝试OAuth登录
  • 登录表单上有一个“记住我”复选框,因此用户可以在登录时为他们创建OAuth令牌
  • 成功登录并记住我将:
    • 查找或创建名称等于User Agent的ClientApplication,必要时创建令牌
    • 在HTML响应中使用javascript标记进行响应。javascript标记将使用作为参数传递的标记调用javascript函数。此函数将OAuth令牌保存到LocalStorage
  • 不成功的OAuth登录尝试将:
    • 在HTML响应中使用javascript标记进行响应。javascript标记将调用javascript函数来清除OAuth令牌的本地存储设置。这将阻止其他OAuth登录尝试

  • 这个过程还有一些细节,如果您愿意,我可以告诉您更多信息。

    因此您在example.com上有一个网站,它需要访问api.com。扩展假定用户登录到example.com,提取会话cookie并将其传递到api.com以获取Oauth令牌。听起来很合理,但也有更简单的方法,不必编写浏览器插件

    在您的例子中,api.com将与example.com通信以验证会话cookie。这两个系统之间有很强的依赖性。OAuth通常用于example.com和api.com互不信任的地方

    由于这两个系统彼此之间已经有了某种信任,您可以做各种事情来简化体系结构:

  • 您可以创建一个托管在example.com/api/*上的代理来验证会话,然后盲目地转发到api.com/*。就浏览器而言,没有跨域请求,所以一切都很好
  • 您可以跨域使用联合登录。这比代理方法更复杂,但是您可以很容易地找到您的平台的现有实现

  • 对于那些后来来到这篇文章的人,我有几点想法:

  • “这安全吗”->这取决于我们想要保护哪些威胁。在以下几点中,我将假设该解决方案已经暗示了一个受信任的网络链接(以防止传输中的令牌或凭据拦截尝试)。然而,描述中缺少一个关键元素,因为它没有提到我们是保护API不受未经授权的用户(人类)还是未经授权的API客户端(如浏览器中运行的恶意扩展)的影响。前者可以通过可用的开放标准非常容易地实现,而人们应该忘记试图阻止来自未经授权的扩展的访问,因为该模型基本上依赖于开源客户端技术。这与工作站安全性有关,而不是设计一个健壮的身份验证/授权机制。我们仍然可以实现某种扩展身份验证机制,但是对于那些知道如何读取扩展源代码的人来说,它是无用的

  • 我们可以通过两种方式来设计平台。通过检测API以允许查询身份验证服务。或者使用基于令牌的访问,在这种访问中,API将在接收到的每个请求中请求存在有效令牌,而不是其发射器。这将意味着使用一个新角色扩展身份验证服务:API票证颁发者,这一角色很少引起兴趣。在阅读该命题时,我们似乎正在通过将会话令牌转发到API来合并这两个世界这是错误的。首先,这不是cookie基的原因