关于通用会话插件的说明

构建时启用lwsgs

  在Cmake时添加 -DLWS_WITH_GENERIC_SESSIONS=1
  这还需要sqlite3(libsqlite3dev或类似的包)

lwsgs简介

  通用会话协议插件为 lws web 和 ws 连接提供基于cookie的登录身份验证。

  该插件处理所有关于通用帐户注册的事情,电子邮件验证、密码丢失、帐户删除和其他通用帐户管理。

  其他代码,在另一个示例中,ws协议处理程序,只需要来自通用会话的非常高级的状态信息,即客户端被认证为哪个用户。下面的所有内容都在通用会话中管理。

  管理员帐户(具有用户可选择的用户名)在配置中定义为密码的SHA-1;其余帐户在sqlite3中

  • cookie中管理的随机20字节会话id

  • 在服务器上保存会话相关的所有信息,客户端不参与管理

  • 服务器使用sqlite3管理活动会话和用户

  • 默认为不关联用户创建匿名会话

  • 在配置中定义有管理员帐户和经SHA-1处理的密码;其余帐户在sqlite3中

  • 用户帐户密码附加混杂符存储为salted SHA-1,仅存储在JSON配置中,而不是数据库中

  • 登录、注销、注册帐户+内置示例的电子邮件验证

  • 在mount中,一些文件后缀(例如.js)可以与协议相关联,以便重写符号名。这些是登录服务器状态的只读副本。

  • 当页面从该装载中获取.js或其他重写文件时,“$lwsgs_user”等将使用分块传输编码 (chunked transfer encoding) 动态重写。

  • 在客户端使用一些重写的符号和 javascript 消除服务器端脚本

  • 32位位字段用于身份验证分区,装载可以在会话的相关服务器端位字段的日志上提供掩码,该掩码必须设置为可访问。

  • 例如,需要登录才能访问的私有URL命名空间不需要代码(仅需配置)。

Lwsgs集成到HTML

在HTML中集成lwsg只需要三个步骤。

  1. lwsgs HTML UI与它在 lwsgs.js 中使用的 javascript 绑定在一起,所以将脚本文件导入头部
  2. 在某处定义id为 “lwsgs” 的空div
  3. 在页面中调用 lwsgs_initial()

就是这样。下面是一个示例

 <html><head><script src="lwsgs.js"></script><style>.body { font-size: 12 }.gstitle { font-size: 18 }</style></head><body style="background-image:url(seats.jpg)"><table style="width:100%;transition: max-height 2s;"><tr><td style="vertical-align:top;text-align:left;width=200px"><img src="lwsgs-logo.png"></td><td style="vertical-align:top;float:right"><div id=lwsgs style="text-align:right;background-color: rgba(255, 255, 255, 0.8);"></div></td></tr></table></form><script>lwsgs_initial();</script></body></html>

Lwsgs总流量

  当协议初始化时,它从配置中获取每个vhost的信息,例如sqlite3数据库的存储位置。管理员用户名和管理员密码的sha-1也取自此处。

  在使用协议通用会话的装载中,针对任何请求维护cookie;如果在初始请求中没有cookie处于活动状态,则会创建一个没有附加用户的新会话。

  因此,在与服务器进行任何事务之后,应该始终有一个活动会话。

  在示例html中,转到mount/lwsgs将加载一个登录/注册页面作为默认页面。

  登录页面中的<form>包含 ‘next url’ 隐藏输入,该输入将决定在成功的管理员登录、成功的用户登录和失败的登录之后,调用哪个表单处理程序进行处理。

  成功登录后,服务器上当前会话的sqlite记录将更新为与登录用户名关联。

Lwsgs配置

  “auth-mask” 定义了授权扇区位,只有在会话上启用它才能获得访问。
  “auth-mask” 默认为0

  • 如果您以用户身份登录,则设置b0。
  • 如果您使用配置为管理员的用户登录,则设置b1
  • 如果帐户已验证,则设置b2(始终验证为管理员配置的帐户)
  • 如果您的会话刚刚成功执行了忘记的密码流,则设置b3
       {# things in here can always be served"mountpoint": "/lwsgs","origin": "file:///usr/share/libwebsockets-test-server/generic-sessions","origin": "callback://protocol-lws-messageboard","default": "generic-sessions-login-example.html","auth-mask": "0","interpret": {".js": "protocol-lws-messageboard"}}, {# things in here can only be served if logged in as a user"mountpoint": "/lwsgs/needauth","origin": "file:///usr/share/libwebsockets-test-server/generic-sessions/needauth","origin": "callback://protocol-lws-messageboard","default": "generic-sessions-login-example.html","auth-mask": "5", # logged in as a verified user"interpret": {".js": "protocol-lws-messageboard"}}, {# things in here can only be served if logged in as admin"mountpoint": "/lwsgs/needadmin","origin": "file:///usr/share/libwebsockets-test-server/generic-sessions/needadmin","origin": "callback://protocol-lws-messageboard","default": "generic-sessions-login-example.html","auth-mask": "7", # b2 = verified (by email / or admin), b1 = admin, b0 = logged in with any user name"interpret": {".js": "protocol-lws-messageboard"}}

  请注意,使用的是使用通用会话的真实应用程序协议的名称,而不是通用会话本身。
  vhost配置存储目录、管理员凭据和会话cookie生存期:

      "ws-protocols": [{"protocol-generic-sessions": {"status": "ok","admin-user": "admin",# create the pw hash like this (for the example pw, "jipdocesExunt" )# $ echo -n "jipdocesExunt" | sha1sum# 046ce9a9cca769e85798133be06ef30c9c0122c9 -## Obviously ** change this password hash to a secret one before deploying **#"admin-password-sha1": "046ce9a9cca769e85798133be06ef30c9c0122c9","session-db": "/var/www/sessions/lws.sqlite3","timeout-idle-secs": "600","timeout-anon-idle-secs": "1200","timeout-absolute-secs": "6000",# the confounder is part of the salted password hashes.  If this config# file is in a 0700 root:root dir, an attacker with apache credentials# will have to get the confounder out of the process image to even try# to guess the password hashes."confounder": "Change to <=31 chars of junk","email-from": "noreply@example.com","email-smtp-ip": "127.0.0.1","email-expire": "3600","email-helo": "myhost.com","email-contact-person": "Set Me <real-person@email.com>","email-confirm-url-base": "http://localhost:7681/lwsgs"}

  与电子邮件相关的设置控制注册和忘记密码的自动电子邮件的生成。

  • email-from: 电子邮件地址自动发送自

  • email-smtp-ip: 通常为 127.0.0.1, 如果在局域网的端口25上有一个合适的服务器,可以在这里使用它。

  • email-expire: 电子邮件中发送的链接在被删除前的秒数

  • email-helo: 与SMTP服务器通信时使用的HELO

  • email-contact-person: 在自动电子邮件中提到的可以回答问题的人

  • email-confirm-url-base: 电子邮件中开始链接的URL,以便收件人可以返回到web服务器

  还必须列出使用通用会话的真实协议,并给出其所需的任何配置

        "protocol-lws-messageboard": {"status": "ok","message-db": "/var/www/sessions/messageboard.sqlite3"},

  注意,真正的应用程序使用自己的sqlite db,没有关于通用会话如何工作或如何存储数据的详细信息。

Lwsgs密码混淆器

  您还可以定义上面示例中所示的每vhost混淆器,当密码被散列时,将密码与salt进行聚合时使用。任何攻击者都需要将混淆器与数据库一起获取,通过使配置目录仅可由root访问/读取,可以使其更加困难。

Lwsgs准备db目录

  您必须准备好db目录,以便它适合lwsws用户使用,这通常意味着apache,例如

 # mkdir -p /var/www/sessions# chown root:apache /var/www/sessions# chmod 770 /var/www/sessions

Lwsgs电子邮件配置

  lwsgs可以通过与localhost:25上的SMTP服务器进行通信来发送电子邮件。这通常是 sendmail 或 postfix,您应该首先使用 mail 应用程序在其上发送,确认其工作正常。

  llwsgs 已经在 stock Fedora sendmail 和 postfix 上进行了测试。

Lwsgs与其他协议集成

  旨在以独立和通用的方式提供会话和帐户。

  但它本身并不有用,实际应用程序总是希望使用通用会话功能。

  我们提供了 “messageboard” 插件,作为如何与实际应用程序协议集成的示例。

  基本方法是“真实”协议处理程序(通常是插件本身)将通用会话插件子类化,并在默认情况下调用它。

   “真正的”协议处理程序完全处理与ws相关的内容,因为通用会话不使用ws。但对于

  • LWS_CALLBACK_HTTP
  • LWS_CALLBACK_HTTP_BODY
  • LWS_CALLBACK_HTTP_BODY_COMPLETION
  • LWS_CALLBACK_HTTP_DROP_PROTOCOL

“真实”协议处理程序检查它是否识别活动(例如,他自己的POST表单URL),如果没有,则将内容传递给通用会话协议回调来处理它。为了简化问题,真正的协议可以只将任何未处理的消息传递给通用会话。

  “real”协议可以使用相同的vhost来获取一个指向通用会话的协议,方法如下:

 vhd->gsp = lws_vhost_name_to_protocol(vhd->vh, "protocol-generic-sessions");

  “真实”协议还必须在其自己的每个会话分配中安排generic-sessions per_session_data。为了使通用会话保持不透明,真实协议必须在运行时分配该空间,使用通用会话协议结构公开的pss大小

 struct per_session_data__myapp {void *pss_gs;...pss->pss_gs = malloc(vhd->gsp->per_session_data_size);

  当实际协议调用通用会话回调时,为通用会话保留的分配将用作user_space

 vhd->gsp->callback(wsi, reason, &pss->pss_gs, in, len);

  这样,“真实”协议就可以将通用会话功能子类化。

  为了简化这些辅助分配的管理,当wsi绑定到协议时以及当绑定被丢弃时,会发生回调。这些应该用于malloc和free以及每个连接的辅助分配。

 case LWS_CALLBACK_HTTP_BIND_PROTOCOL:if (!pss || pss->pss_gs)break;pss->pss_gs = malloc(vhd->gsp->per_session_data_size);if (!pss->pss_gs)return -1;memset(pss->pss_gs, 0, vhd->gsp->per_session_data_size);break;case LWS_CALLBACK_HTTP_DROP_PROTOCOL:if (vhd->gsp->callback(wsi, reason, pss ? pss->pss_gs : NULL, in, len))return -1;if (pss->pss_gs) {free(pss->pss_gs);pss->pss_gs = NULL;}break;

从另一个协议获取会话特定信息

  至少在有人试图使用您的真实协议将 http(s) 连接升级到 ws(s) 时,有必要确认 http(s) 与通用会话的cookie,并找出他的用户名和其他信息。

  通用会话允许另一个协议通过调用他的回调再次检查它,lws本身提供了一个通用的会话信息结构来传递相关数据

 struct lws_session_info {char username[32];char email[100];char ip[72];unsigned int mask;char session[42];};struct lws_session_info sinfo;...vhd->gsp->callback(wsi, LWS_CALLBACK_SESSION_INFO,&pss->pss_gs, &sinfo, 0);

  调用通用会话后,结果可以是

  • 所有字符串的长度都为零,掩码为零,没有可用的cookie
  • 仅设置.ip和.session。cookie正常,但没有用户登录
  • 所有字符串都包含有关登录用户的信息
      真正的协议可以使用它来拒绝未经身份验证的尝试从http连接打开ws连接;之后,无需再次检查ws连接身份验证状态。

README.generic-sessions.md相关推荐

  1. README.md的内容格式

    md是Markdown的缩写,md是一种易读易写的文本格式(easy-to-read, easy-to-write plain text format),并且可以很方便的转换成HTML格式显示在网页中 ...

  2. python README

    常用的README文件格式有:MD(MarkDown)和rst; http://blog.csdn.net/u011001084/article/details/52803778 http://www ...

  3. php 5.5.7.tar.gz,编译 php-5.5.26.tar.gz

    需要GD库大于2.1版本 编译GD库请参考文章 安装GD库 ./configure --prefix=/usr/local/php/ --with-config-file-path=/usr/loca ...

  4. hexo博客搭建时遇到的一些问题

    之前的WP博客荒废了好久之后终于感觉该做点正事了,所以这几天花了点时间重新弄了下hexo,毕竟是比较符合前端的一个博客框架.比起wp来说,hexo轻量级的多,而且易部署(指速度优化方面),也不需要一个 ...

  5. Git之深入解析本地仓库的基本操作·仓库的获取更新和提交历史的查看撤销以及标签别名的使用

    一.获取 Git 仓库 通常有两种获取 Git 项目仓库的方式: 将尚未进行版本控制的本地目录转换为 Git 仓库: 从其它服务器克隆一个已存在的 Git 仓库. 两种方式都会在本地机器上得到一个工作 ...

  6. 如何在新版的gitbook上写自己的书

    前言 之前为了学习QT当中的qmake,就去看QT的官方文档,但QT的官方文档都是英文的,而自己本身英文较差,就一咬牙决定不如就把qmake的使用文档翻译一下吧.这样即可以加深对文档的理解,也可以留着 ...

  7. 如何快速生成JavaScript文档

    JSDoc Template 记得有大神说过,尽量不要注释,除了JsDoc.JsDoc 可以帮助我们通过 JsDoc 的注释风格快速生成 Api 文档.比如 lodash 文档. JsDoc 可以让开 ...

  8. git命令——git commit

    功能 将暂存区中的更改记录到仓库. 加到staging area里面的文件,是表示已经准备好commit的.所以在commit修改之前,务必确定所有修改文件都是staged的.对于unstaged的文 ...

  9. Git--Git基本使用

    一.工作原理 / 流程 Workspace:工作区 Index / Stage:暂存区 Repository:仓库区(或本地仓库) Remote:远程仓库 二.获取 Git 仓库 有两种取得 Git ...

  10. android x86启动卡死,[更新]Android-x86启动成功,但是还有点小问题。

    在放着4个版本的MeeGo优盘上再加上一个android-x86-2.2-generic.iso.方法跟MeeGo的一样的操作过程,同时对启动参数也做了一些小修改.结果如下: android-x86- ...

最新文章

  1. 有了阿里云服务器如何运行Javaweb项目【安转JDK】【安装mysql】【安装Tomcat】【永久运行】
  2. [LeetCode]ZigZag Conversion
  3. HttpClient的连接池||HttpClient的请求参数
  4. php 时钟函数,使用PHP的日期与时间函数技巧
  5. 局域网只能看到一部分电脑_win10 网上邻居看不到其它电脑、共享不了文件
  6. Laravel源码解析之中间件
  7. Android基础知识之智能指针:强指针和弱指针
  8. mysql各存储引擎介绍表格_十六、MySQL基础系列笔记之数据表存储引擎的介绍
  9. Atiti  attilax主要成果与解决方案与案例rsm版 v4
  10. CMM3下的应用及改进
  11. YUV444、YUV422、YUV420占用字节数
  12. MQTT 客户端工具
  13. Steam[ASF]挂卡(挂游戏时间)纯新手教学
  14. 暑假将至,人贩子猖狂
  15. python字符串介绍_python字符串详解
  16. linux怎么进入etc目录,Linux 系统的/etc目录
  17. RabbitMQ安装后Web管理页面访问不了
  18. ubuntu 下载以及安装CPAN
  19. nsga 的java实现_Java – Scala遗传算法(GA)库中的模拟二进制交叉(SBX)交叉运算符
  20. Hadoop 入门学习思维导图

热门文章

  1. qt获取文件 图片大小
  2. bat脚本,windown定时关机,取消定时关机,设置延长关机时间
  3. 计算机专业大学排名(全168所学校)
  4. React上拉加载(React-PullLoad)
  5. C++算法之归并排序
  6. IDEA社区版搭建Tomcat服务器并创建web项目
  7. 相对定位的元素会在原先的地方
  8. Linux下dirname命令详解及C/C++代码实现
  9. 无力吐槽的 create-shortcut .exe
  10. 对TS流的一些理解TS流的结构