emqx_auth_http

简介: emqx_auth_http

用途

emqx_auth_http 插件用于 HTTP 认证,使用外部自建 HTTP 应用认证数据源,根据 HTTP API 返回的数据判定认证结果,能够实现复杂的认证鉴权逻辑。


认证原理

EMQ X 在设备连接事件中使用当前客户端相关信息作为参数,向用户自定义的认证服务发起请求查询权限,通过返回的 HTTP响应状态码 (HTTP statusCode) 来处理认证请求。

  • 认证失败API 返回 4xx 状态码
  • 认证成功API 返回 200 状态码
  • 忽略认证API 返回 200 状态码且消息体 ignore


认证请求

进行身份认证时, EMQ X 将使用当前客户端信息填充并发起用户配置的认证查询请求,查询出该客户端在 HTTP 服务器端的认证数据。


HTTP 请求方法为 GET 时,请求参数将以 URL 查询字符串的形式传递; POSTPUT 请求则将请求参数以普通表单形式或者以 Json 形式提交(由 content-type 的值决定)。


你可以在认证请求中使用以下占位符,请求时 EMQ X 将自动填充为客户端信息:

占位符 信息
%u 用户名
%c Client ID
%a 客户端 IP 地址
%r 客户端接入协议
%P 明文密码
%p 客户端端口
%C TLS 证书公用名(证书的域名或子域名),仅当 TLS 连接时有效
%d TLS 证书 subject ,仅当 TLS 连接时有效


提示

推荐使用 POSTPUT 方法,使用 GET 方法时明文密码可能会随 URL 被记录到传输过程中的服务器日志中。


插件配置

docker-compose.yaml 中的配置:

version: '3.8'
volumes:
  vol-emqx-data:
    name: emqx-data
  vol-emqx-etc:
    name: emqx-etc
  vol-emqx-log:
    name: emqx-log
services:
  emqx:
    image: emqx/emqx:4.3.4
    container_name: emqx
    restart: always
    network_mode: host
    pid: host
    volumes:
      - vol-emqx-data:/opt/emqx/data
      - vol-emqx-etc:/opt/emqx/etc
      - vol-emqx-log:/opt/emqx/log
      - /etc/localtime:/etc/localtime:ro
    environment:
      EMQX_ALLOW_ANONYMOUS: 'false' # 禁止匿名连接
      EMQX_ACL_NOMATCH: deny  # ACL未命中时,拒绝 发布/订阅 操作
      EMQX_ENABLE_ACL_CACHE: 'off'  # 关闭ACL鉴权缓存
      # http auth 插件配置
      EMQX_AUTH__HTTP__AUTH_REQ__URL: http://127.0.0.1:3000/emqx/auth
      EMQX_AUTH__HTTP__AUTH_REQ__METHOD: post
      EMQX_AUTH__HTTP__AUTH_REQ__CONTENT_TYPE: json
      EMQX_AUTH__HTTP__AUTH_REQ__PARAMS: client_id=%c,username=%u,password=%P,ip_address=%a,protocol=%r
      EMQX_AUTH__HTTP__SUPER_REQ__URL: http://127.0.0.1:3000/emqx/superuser
      EMQX_AUTH__HTTP__SUPER_REQ__METHOD: post
      EMQX_AUTH__HTTP__SUPER_REQ__CONTENT_TYPE: json
      EMQX_AUTH__HTTP__SUPER_REQ__PARAMS: client_id=%c,username=%u
      EMQX_AUTH__HTTP__ACL_REQ__URL: http://127.0.0.1:3000/emqx/acl
      EMQX_AUTH__HTTP__ACL_REQ__METHOD: get
      EMQX_AUTH__HTTP__ACL_REQ__CONTENT_TYPE: json
      EMQX_AUTH__HTTP__ACL_REQ__PARAMS: access=%A,username=%u,client_id=%c,ip_address=%a,topic=%t,mount_point=%m,protocol=%r
点击复制复制失败已复制


根据上述配置,自建的 HTTP 服务器需要实现三个接口,分别为: /emqx/auth/emqx/superuser/emqx/acl


注意

容器启动后默认是没有开启 emqx_auth_http 插件的,需要手动去开启。


自建HTTP服务实现

MQTT客户端连接的时候,EMQ X会首先调用/emqx/auth接口,根据这个接口的信息判断用户是否可以连接,如果可以连接,继续判断是否为超级用户,如果为超级用户,后面客户端的发布订阅就不需要ACL了,自动拥有权限了,否则等到客户端发布或者订阅某条消息的时候会继续走ACL接口判断客户端是否拥有权限。


实现代码:(基于 nestjs )

import { ApiBearerAuth, ApiTags, ApiOperation } from "@nestjs/swagger";
import { Controller, Post, Body, HttpException, HttpStatus, Res, Query, Get } from "@nestjs/common";
import { Response } from 'express';
import { DeviceAuthEmqxReqDto } from "../../dtos/device/emqx/device-auth.emqx.req.dto";
import { CheckSuperuserEmqxReqDto } from "../../dtos/device/emqx/check-superuser.emqx.req.dto";
import { CheckACLEmqxReqDto } from "../../dtos/device/emqx/check-acl.emqx.req.dto";
@ApiTags('device Emqx')
@Controller('emqx/devices')
export class DeviceEmqxController {
  @ApiOperation({ summary: 'emqx 连接验证' })
  @Post('auth')
  async create(@Body() body: DeviceAuthEmqxReqDto, @Res() res: Response) {
    // TODO: 实现验证逻辑
    return res.status(HttpStatus.OK).send('success');
  }
  @ApiOperation({ summary: 'emqx校验是否为超级用户' })
  @Post('superuser')
  async superuser(@Body() body: CheckSuperuserEmqxReqDto, @Res() res: Response) {
    // TODO: 实现验证逻辑
    return res.status(status).send('success');
  }
  @ApiOperation({ summary: 'emqx获取用户ACL权限' })
  @Get('acl')
  async getACL(@Query() query: CheckACLEmqxReqDto, @Res() res: Response) {
    // TODO: 实现验证逻辑
    return res.status(status).send('success');
  }
}
目录
相关文章
|
3月前
|
网络协议
使用`http.server`模块搭建简单HTTP服务器
使用`http.server`模块搭建简单HTTP服务器
|
5月前
|
应用服务中间件 网络安全 nginx
Client sent an HTTP request to an HTTPS server
Client sent an HTTP request to an HTTPS server
586 0
|
12月前
|
前端开发
64 # 实现一个 http-server
64 # 实现一个 http-server
38 0
|
11月前
|
Docker 容器
http: server gave HTTP response to HTTPS client解决方案
http: server gave HTTP response to HTTPS client解决方案
703 0
|
JSON 数据安全/隐私保护 数据格式
HTTP Server
HTTP Server
100 0
HTTP Server
HTTP client
HTTP client
143 0
|
缓存 安全 算法
深入 HTTP/3(2)|不那么 Boring 的 SSL
对于 QUIC 的浅述中我们了解到,QUIC 的优化很大程度上是一种基于 TLS 流程的优化,由此也可见 TLS 对于 QUIC 的重要性,那么今天我们就来聊一聊 QUIC-TLS。为了表述尽量没有歧义,我们先来规范下文章中各个术语的意义。
深入 HTTP/3(2)|不那么 Boring 的 SSL
|
Docker 容器
docker pull 报错:Get https://registry:5000/v1/_ping: http: server gave HTTP response to HTTPS client
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34173549/article/details/80415283    ...
4830 0