Javascript 中的安全 OAuth

2024-01-24

我有一个 api,它使用 OAuth 1.0a 来验证使用它的应用程序。它正在取代旧的 API,旧的 API 使用了许多自定义构建和大杂烩调用,但这些调用已被弃用。

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

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

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

我计划实施的内容如下:

  • 用户在浏览器中登录网站。
  • 该网站向他们发出一个带有会话密钥的 cookie。
  • 然后我们的扩展获取该 cookie 并将其传递给 api。
  • API 验证它是有效且活动的会话,并向扩展程序发出其访问令牌。
  • 这些令牌在过期前最多持续一小时。
  • javascript 发出的 cookie 的速率限制也将降低。

它在以下假设下运作:

  • 如果其他应用程序可以访问您的 cookie,那么他们无论如何都可以在网站上冒充您,因此访问 api 也没有什么不同。
  • 所有身份验证方法仍然受到我们的控制。
  • 代币定期过期意味着如果它们被泄露,那么利用的时间是有限的。

我的问题是,这是一种限制 api 访问的安全方法吗? 还有更好的吗?

一些注释。我知道 Chrome 扩展程序可以请求访问给定站点的 cookie 的权限。我相信 Firefox 扩展也可以做到这一点。

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


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

  1. OAuth 仅在具有 LocalStorage 的浏览器上受支持
  2. 登录表单将检查 LocalStorage 中的 OAuth 密钥,并在 OAuth 密钥存在时自动尝试 OAuth 登录。
  3. 登录表单上有一个“记住我”复选框,因此用户可以在登录时为其创建 OAuth 令牌。
  4. A successful login w/ remember me will:
    • 查找或创建名称等于 User Agent 的 ClientApplication,并根据需要创建令牌
    • 在 HTML 响应中使用 javascript 标记进行响应。 javascript 标签将使用作为参数传递的标记来调用 javascript 函数。此函数会将 OAuth 令牌保存到 LocalStorage。
  5. An unsuccessful OAuth login attempt will:
    • 在 HTML 响应中使用 javascript 标记进行响应。 javascript 标记将调用 javascript 函数来清除 OAuth 令牌的 LocalStorage 设置。这将阻止额外的 OAuth 登录尝试

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Javascript 中的安全 OAuth 的相关文章

  • 如何设置上传的文件名?

    By using multer I made it to request image file like this 这个文件存储在我设置的 上传 文件夹中 我的代码如下 var multer require multer var uploa
  • React Native:不透明视图内的透明视图

    我想用不透明框架和透明中心显示相机的视图 就像图片中的一样 黑色部分是相机的视图 我正在寻找具有纯反应本机组件的解决方案 没有额外的库 例如https github com gilbox react native masked view h
  • 如何使用 JavaScript 选择预节点/块中的文本?

    我了解不允许 JS 将任意文本复制到剪贴板背后的安全原因 但是是否有一种方法可以通过单击按钮来选择预节点中的文本 类似于 select 函数在输入中的工作方式 我不是在寻找复制到剪贴板的 jQuery 插件 我只想突出显示预块中的文本 以便
  • 雅虎 OAuth2 隐式授予流程不适用于新的雅虎应用程序

    我有现有的网络应用程序和专用雅虎应用程序 https developer yahoo com apps 在职的 它用OAuth2 隐式授权流程 https developer yahoo com oauth2 guide flows imp
  • 如何在 Sequelize ORM 中限制连接行(多对多关联)?

    Sequelize 定义了两种模型 具有多对多关联的 Post 和 Tag Post belongsToMany db Tag through post tag foreignKey post id timestamps false Tag
  • 实现悬停信息框

    我有一个日历 当用户将鼠标悬停在单元格上时 会出现一个很大的信息框 其中包含该日期的详细信息 虽然当用户离开时使信息框消失 但我遇到了一些麻烦 我基本上想要它 这样当鼠标光标移出信息框隐藏的日历单元格时 它就会消失 但我遇到了麻烦 因为mo
  • Sequelize - 使用 es6 和模块运行迁移

    我不确定我是否做错了什么或者什么 我觉得我正在运行一个现代的 相当常见的堆栈 但我无法让新的 Sequelize v6 与我的设置完美配合 我在 Node v14 17 Sequelize v6 6 2 上 在我的 package json
  • 在多个动态添加的表单上初始化 jQuery validate() 函数

    有人建议最好初始化一个 form validate 在页面加载而不是点击事件上运行 jquery form validate 插件仅允许在输入更改时提交 https stackoverflow com questions 10984196
  • 递归修剪对象中所有元素的更好方法?

    如果我有一个像这样的物体 const obj field subfield innerObj a asdasd asdas innerArr s ssad innerArrObj b adsad 我想出了这样的东西 const trimFi
  • 在动态创建的元素上添加事件监听器[重复]

    这个问题在这里已经有答案了 是否可以向所有动态生成的元素添加事件侦听器 Javascript 我不是页面的所有者 因此我无法以静态方式添加侦听器 对于页面加载时创建的所有元素 我使用 doc body addEventListener cl
  • 在 setInterval / setTimeout 中使用变量作为时间[重复]

    这个问题在这里已经有答案了 这是一个示例情况 var count time 1000 setInterval function count 1 time 上面的代码会将 count 变量加 1 即 1000 毫秒 看来 setInterva
  • setInterval() 在用户离开选项卡时暂停?

    javascript 中是否有任何方法的行为类似于 setInterval 并且当用户离开选项卡时停止并在用户再次进入选项卡时恢复 您可以使用以下方法创建自己的 API可见性API https developer mozilla org e
  • 使用 :hover 作为元素的内联样式(使用 HTML/CSS/php)[重复]

    这个问题在这里已经有答案了 可能的重复 如何将 a hover 规则嵌入到文档中间的样式属性中 https stackoverflow com questions 131653 how do i embed an ahover rule i
  • 避免在 ES6 的函数内定位 this 的对象作用域

    例如 我正在使用 D3 js 运行一个项目 导入特定模块并调用它们的函数 Setup TypeScript ES6 导入特定的 D3 组件 角6 我有一个对象 在本例中是一个角度指令 并在 SVG 画布上绘制一些圆圈 并希望它们在拖动事件上
  • 窗口大小调整触发的 DOM 事件

    我有一个布局相当复杂的页面 最初打开页面时 某些元素的对齐存在问题 但是 可以通过更改浏览器窗口的大小来 永久 解决此问题 显然 我不希望用户必须调整浏览器窗口的大小才能使页面正确显示 所以我想知道是否有一种方法可以在页面首次加载时以编程方
  • 尝试使用 Firebug 查找 JavaScript 文件中的函数

    我试图找到这个函数调用 myFooBar 该函数在某些 HTML 中内联引用 但页面加载了大量 JavaScript 并且在每个文件中搜索该函数需要相当多的工作 如何使用 Firebug 找到此函数所在的 JavaScript 文件 打开脚
  • 如何使用 JavaScript 获取元素的填充值?

    我有一个textarea在我的 HTML 中 我需要获取整数或浮点形式的填充数值 以像素为单位 我如何使用 JavaScript 获取它 我没有使用 jQuery 所以我正在寻找纯 JavaScript 解决方案 这将返回padding l
  • 不使用控件时,视频元素在 Chrome 中消失

    So I think这是一个浏览器错误 它出现在一个更复杂的设计 网站中 但我已经进行了很好的尝试 简化了我的代码和设计等 并发现了以下内容 嵌入时
  • Javascript onload 不起作用[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我正在使用
  • Django 将 JSON 数据传递给静态 getJSON/Javascript

    我正在尝试从 models py 中获取数据并将其序列化为views py 中的 JSON 对象 模型 py class Platform models Model platformtype models CharField max len

随机推荐