Websocket、Angular 2 和 JSON Web 令牌身份验证

2024-04-17

我的 Angular 2 应用程序(用打字稿编码)有一个简单的身份验证方案:

  • 用户登录:
  • 服务器返回 JSON Web 令牌 (JWT)abc123...
  • 在每次 API 调用时,应用程序都会将 JWT 发送到Authorization header
  • 服务器验证 JWT 并授予访问权限

现在我想添加网络套接字。我想知道如何对那里的用户进行身份验证。由于我不控制将哪些标头发送到 websocket 服务器 (WS),因此我无法发送 JWT。

到目前为止我的想法(尚未实施):

  • 客户端打开websocket:let sock = new WebSocket('wss://example.com/channel/');
  • WS 服务器接受握手而不进行任何身份验证检查。标准 HTTP 标头在此阶段可用。
  • Client listens to the open event on the socket. Once the socket is open:
    • 客户端发送一条消息type='auth' payload='JWT_VALUE'
  • WS server expects 1st message on a socket to be of type auth. Once that is received, server reads the payload, validates JWT_VALUE and sets an isAuthenticated flag
    • 如果验证失败,服务器将断开套接字
    • 如果客户没有isAuthenticated发送任何其他类型的消息,服务器断开套接字

2 个问题:服务器资源可能会被连接但从不发送 JWT 的客户端占用,如果客户端未经身份验证,更干净的解决方案会阻止握手。

其他想法:

  • Client could send JWT in the path: new WebSocket('wss://example.com/channel/<JWT>/')
    • 优点:此信息在握手期间可用
    • 缺点:该路径似乎不是 JWT 的“合适”位置。具体是因为中间代理和访问日志会保存路径;在设计 HTTP API 时,我已经决定不在 u​​rl 中包含 JWT
  • Server could read the client's IP + UserAgent and match against a DB record that was created by the HTTP server when the JWT was issued. Server will then guess who is connecting
    • 优点:此信息可能在握手期间可用(不确定 IP)
    • 缺点:“似乎非常不安全”guess“当客户端从一开始就没有提供 JWT 时,客户端就应该与 JWT 相关联。这意味着,例如有人欺骗受害者的 UA 并使用相同的网络(代理、公共 wifi、大学内联网......)将能够冒充受害者。

如何对 Websocket 上的客户端进行身份验证?假设用户已经通过 HTTP 登录,并且 Angular 2 应用程序具有 JWT 令牌。


我决定采用以下协议:

1.客户端登录站点并接收身份验证令牌(JSON Web 令牌)

GET /auth
{
    user: 'maggie',
    pwd:  'secret'
}

// response
{ token: '4ad42f...' }

2.经过身份验证的客户端请求 websocket 连接票证

GET /ws_ticket
Authorization: Bearer 4ad42f...

// response: single-use ticket (will only pass validation once)
{ ticket: 'd76a55...', expires: 1475406042 }

3.客户端打开 websocket,在查询参数中发送票证

var socket = new WebSocket('wss://example.com/channel/?ticket=d76a55...');

4.然后,Websocket 服务器 (PHP) 在接受握手之前验证票证

/**
* Receives the URL used to connect to websocket. Return true to admit user,
* false to reject the connection
*/
function acceptConnection($url){
    $params = parse_str(parse_url($url, PHP_URL_QUERY));
    return validateTicket($params['ticket']);
}

/** Returns true if ticket is valid, never-used, and not expired. */
function validateTicket($ticket){/*...*/}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Websocket、Angular 2 和 JSON Web 令牌身份验证 的相关文章

  • 如何检索使用 Apache 的 mod_ldap 进行身份验证的用户的用户信息?

    我使用 Apache 进行 LDAP 身份验证 现在我需要知道如何获取使用 PHP 登录的用户 有可能吗 我是否必须在 PHP 中进行身份验证才能存储用户名 如果您激活 mod authnz ldap 模块并按如下方式配置您的部分
  • 如何在 TypeScript 中从字符串数组创建类型?

    基于字符串数组创建 TypeScript 类型的最佳方法是什么 我的版本是2 6 2 该数组很长 我不想通过在枚举声明中复制字符串值来重复自己 我想做的是这样的 const colors red orange yellow green bl
  • websocket 订阅服务器不工作。无法到达订阅服务器 graphql-ws ws

    我遵循 相同的文档代码 1 使用websocket graphql创建订阅服务器 但它不适用于graphql ws和ws 当我删除 serverCleanup 定义时 代码有效 并且它也适用于旧的订阅库 subscription trans
  • Angular 2子组件引用父组件

    我有一个包含三个组件的应用程序 应用程序 编辑视图 对话框 应用程序组件包含 EditView 组件 该组件可以包含许多其他 EditView 组件和一个 Dialog 组件 如果 Dialog 组件在页面上可见 对话框组件包含应用程序组件
  • Dart 将客户端 Socket 升级为 WebSocket

    Since WebSocket https api dartlang org stable 2 1 0 dart io WebSocket class html在 Dart 中不允许直接设置安全上下文 https api dartlang
  • NativeScript 中的多行文本框

    如何在本机脚本中获取支持多行的文本区域 我尝试过使用不支持多行的文本字段 还尝试过此代码将多行添加到文本字段 var myTextfield this page getViewById
  • Angular 自定义异步验证器保持挂起状态

    我有一个自定义验证器 可以验证用户的电子邮件是否唯一 我在 stackoverflow 和 internet 上搜索了相关主题 但没有帮助 当我在表单中提供输入 发送请求 时 请求保持待处理状态并且不会解析 我已经在邮递员中测试了后端 它按
  • Angular:如何从 HttpClient 下载文件?

    我需要从我的后端下载一个Excel 它返回一个文件 当我执行请求时 我收到错误 类型错误 您在需要流的地方提供了 未定义 你 可以提供 Observable Promise Array 或 Iterable 我的代码是 this http
  • 我应该如何安全地存储密码并在 chrome 扩展中使用 http auth

    我正在制作一个 chrome 扩展 需要从安全服务器获取 xml 文件 我目前正在使用 XMLHttpRequest 来调用服务器 https username email protected cdn cgi l email protect
  • ngClass多次调用方法[重复]

    这个问题在这里已经有答案了 我创建了一个方法并将其附加到 ngClass 以根据条件添加两种样式 我还将数字作为参数传递以在 switch case 中使用 组件 html div class circle div class circle
  • 如何从组件内获取对 Angular 构建的 ControlGroup 的引用?

    我有一个组件 包含模板驱动表单 我真正想做的是添加一个代码routerCanDeactivate检查表单是否为的方法pristine如果没有 则在继续导航之前警告用户 我知道 Angular 采用模板驱动形式并构建一个 ControlGro
  • subject.next 不在 ngOnInit 中触发

    有谁知道为什么这段代码 从主题初始化一个值 不起作用 是否存在错误或设计使然 我究竟做错了什么 ts import Component OnInit from angular core import Subject from rxjs Co
  • TypeScript GUID 类? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有谁知道在 TypeScript 中像 GUID UUID 这样的 C 的良好 可靠的实现吗 我自己可
  • ASP.NET MVC - 角色提供程序的替代方案?

    我试图避免使用角色提供程序和成员资格提供程序 因为在我看来它太笨拙了 因此我试图制作自己的 版本 它不那么笨拙并且更易于管理 灵活 现在我的问题是 除了角色提供者之外 还有其他不错的选择吗 我知道我可以自定义角色提供者 会员提供者等 通过更
  • 无法在代理后面使用量角器运行 Angular > 2 e2e

    将不胜感激任何帮助 我在windows上运行 我在全球安装了量角器版本5 3 0 在更新网络驱动程序之前我运行 webdriver manager clean 并更新版本如下 webdriver manager 更新 ie32 proxyh
  • Laravel 5.5 多重身份验证路由问题

    尝试使用 Doctrine 而不是 Eloquent 让 Laravel 进行多重身份验证 我已经尝试了很多事情 但总是陷入困境 我目前定义了两个守卫 两个模型 两个登录控制器等 如果我启用其中之一 它们就会起作用 如果我同时尝试两者 则似
  • 如何使用 Angular2 数据表

    找不到任何使用教程angular2 data table图书馆在这里 https github com swimlane angular2 data table https github com swimlane angular2 data
  • Angular Universal - 不应使用超时

    所以我一直在尝试将我的应用程序转换为角度通用的 并且在大多数情况下它都很好 但我之前读过一些 陷阱 https github com onespeed articles angular universal gotchas https git
  • Karma 与 Webpack 和 Typescript 不执行任何测试

    我试图弄清楚如何将 Karma 测试运行器与 Webpack 和 Typescript 源文件一起使用 以此源文件作为唯一的测试文件为例 测试规格 var message string yay alert message describe
  • 如何让 VSCode 显示 strictNullChecks Typescript 错误

    当我使用以下内容构建项目时tsconfig json 由于最近添加而出现错误strictNullChecks true version 2 3 4 compilerOptions allowSyntheticDefaultImports f

随机推荐