当前位置: 首页 > article >正文

使用apisix+oidc+casdoor配置微服务网关

一、服务架构图

在这里插入图片描述

二、安装配置

1. 安装配置apisix

(1). 快速启动及验证:
curl -sL https://run.api7.ai/apisix/quickstart | sh

该命令启动 apisix-quickstart 和 etcd 两个容器,APISIX 使用 etcd 保存和同步配置。APISIX 和 etcd 容器使用 Docker 的 host 网络模式,因此可以从本地直接访问。

如果一切顺利,将输出如下信息:

✔ APISIX is ready!

通过 curl 来访问正在运行的 APISIX 实例。比如,你可以发送一个简单的 HTTP 请求来验证 APISIX 运行状态是否正常:

curl "http://127.0.0.1:9080" --head | grep Server

如果一切顺利,将输出如下信息:

Server: APISIX/Version
(2). 其他安装方式

APISIX 安装指南

(3). 介绍如何修改服务配置

APISIX 会通过apisix/cli/ngx_tpl.lua这个模板和conf/config-default.yamlconf/config.yaml生成 Nginx 的配置文件,因此直接修改 Nginx 的配置文件是无效的。
进入容器,可以在/usr/local/apisix/conf/nginx.conf看到生成的 Nginx 配置文件。 在自定义 Nginx 配置文件之前,烦请仔细阅读conf/config-default.yaml
conf/config.yaml里面可以覆盖掉默认值。举个例子,你可以通过xxx_snippet之类的配置,在conf/nginx.conf里面注入你的自定义配置: 注意nginx_config及其子项的格式缩进,在执行./bin/apisix start时,错误的缩进将导致更新conf/nginx.conf文件失败。

在config.yaml文件,有一些snippet:

main_configuration_snippet: |
http_configuration_snippet: |
http_server_configuration_snippet: |
http_server_location_configuration_snippet: |
http_admin_configuration_snippet: |
http_end_configuration_snippet: |
stream_configuration_snippet: |

在其下面添加内容会生成到nginx.conf文件中指定位置。比如:http_server_location_configuration_snippet下写的内容会加入在 #http server location configuration snippet starts下
在这里插入图片描述
比如在config.yaml中进行以下配置:

http_server_location_configuration_snippet: |
    proxy_set_header   X-Forwarded-For     off;
    proxy_set_header   X-Forwarded-Proto    $var_x_forwarded_proto;
    proxy_set_header   X-Forwarded-Host     $var_x_forwarded_host;
    proxy_set_header   X-Forwarded-Port     $var_x_forwarded_port;

会在生成的nginx.conf以下位置中添加配置

# http server location configuration snippet starts
    proxy_set_header   X-Forwarded-For     off;
    proxy_set_header   X-Forwarded-Proto    $var_x_forwarded_proto;
    proxy_set_header   X-Forwarded-Host     $var_x_forwarded_host;
    proxy_set_header   X-Forwarded-Port     $var_x_forwarded_port;
1). 修改log级别

例如将log级别改为debug,在config.yaml中添加如下配置:

nginx_config:
#  http_configuration_snippet: |
#    client_header_buffer_size 16k; # 调整允许的请求头大小,最大为16k
  error_log_level:  debug

https://apisix.apache.org/docs/apisix/FAQ/#how-do-i-change-apache-apisixs-log-level

2). 配置apisix使用redis存储session,解决OIDC默认使用cookie来存储加密后的jwt导致request header too large问题
nginx_config:
  http_server_configuration_snippet: |
    set $session_storage redis;
    set $session_secret 623q4hR325t36VsCD3g567922IC0073T;
    set $session_redis_host 172.25.0.11;
    set $session_redis_port 6379;
    set $session_redis_ssl off;
    set $session_redis_ssl_verify off;

https://github.com/apache/apisix/issues/6792#issuecomment-1126999266

(4). apisix常用命令

当 APISIX 启动时,Admin API 默认情况下将会监听 9180 端口,并且会占用前缀为 /apisix/admin 的 API。

因此,为了避免你设计的 API 与 /apisix/admin 冲突,你可以通过修改配置文件 /conf/config.yaml 中的配置修改默认监听端口。

APISIX 支持设置 Admin API 的 IP 访问白名单,防止 APISIX 被非法访问和攻击。你可以在 ./conf/config.yaml 文件中的 deployment.admin.allow_admin 选项中,配置允许访问的 IP 地址。

在下文出现的 X-API-KEY 指的是 ./conf/config.yaml 文件中的 deployment.admin.admin_key.key,它是 Admin API 的访问 token。

1). 查看路配置
curl http://127.0.0.1:9180/apisix/admin/routes  -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'
2). 删除路由配置
curl -i -X DELETE http://127.0.0.1:9180/apisix/admin/routes/1  -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1'
3). 创建/更新路由配置
curl -i "http://127.0.0.1:9180/apisix/admin/routes" -X PUT -d '
{
  "id": "getting-started-ip",
  "uri": "/ip",
  "upstream": {
    "type": "roundrobin",
    "nodes": {
      "httpbin.org:80": 1
    }
  }
}'

详情可查看apisix官网文档: https://apisix.apache.org/docs/apisix/admin-api/

2. 安装配置casdoor

(1). 使用docker安装
docker run -p 8000:8000 casbin/casdoor-all-in-one

在这里插入图片描述
默认账号密码为:admin/123

(2). 配置casdoor

在这之前介绍一些casdoor的基本概念。
组织是Casdoor的基本单位,它管理着用户和应用,组织之间是相互隔离的。 如果一个用户登录到一个组织,他可以在无需再次登录的情况下访问属于该组织的所有应用。
根据架构图,casdoor作为认证中心,apisix是需要接入到casdoor的一个应用。

1). 创建组织

在这里插入图片描述
在这里插入图片描述

2). 创建应用

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3). 创建用户

在这里插入图片描述
在这里插入图片描述

3. 将casdoor配置为apisix的认证中心

1). 创建oidc插件

它的作用是,当创建的路由引用这个插件时,如果用户未登录,拦截用户的请求

curl http://127.0.0.1:9180/apisix/admin/plugin_configs/1000 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -i -d '
{
    "desc": "test-oidc",
    "plugins": {                 
      "openid-connect":{                                              
        "client_id": "11f0f7aedeadf26f266c",
        "client_secret": "8e30fc2463344170d8e05ec63d5a3056c8e605fa",
        "discovery": "http://192.168.237.1:8000/.well-known/openid-configuration",
        "bearer_only": false,
        "realm": "master",
        "introspection_endpoint_auth_method": "client_secret_basic",
        "redirect_uri":"http://192.168.237.1:9080/callback"
      }
    }
}'
2). 创建静态文件路由,允许直接访问静态文件

下面的静态服务可以用nginx打包一个容器来私服静态文件

curl http://127.0.0.1:9180/apisix/admin/routes/2000 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
  "uri": "/*",
  "host": "test_domain.com",
  "vars": [
      ["uri", "~~", ".(js|css|flash|media|jpg|png|gif|ico|svg|json)$"]
  ],
  "upstream":{
    "type": "roundrobin",
    "nodes":{
      "static-service:80":1
    }
  }
}'
3). 拦截余下所有路径请求

下面的plugin_config_id即为引用的oidc插件id,当请求网站根路径时,会自动跳转到casdoor,当用户未登录请求非静态文件路径时,会报错。

curl http://127.0.0.1:9180/apisix/admin/routes/3000 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
  "uri": "/*",
  "host": "test_domain.com",
  "enable_websocket":true,
  "plugin_config_id": 1000,
  "upstream":{
    "type": "roundrobin",
    "nodes":{
      "api-service:80":1
    }
  }
}'

http://www.kler.cn/a/463920.html

相关文章:

  • Vue项目中生成node_modules文件夹的两种常用方法及npm优势
  • 汽车燃油软件标定测试
  • UE5 Debug的一些心得
  • React 数据是怎样传递的
  • 单元测试3.0+ @RunWith(JMockit.class)+mock+injectable+Expectations
  • 默认ip无法访问,利用dhcp功能获取ip进行访问的方法
  • 第二讲 比特币的技术基础
  • GPU 进阶笔记(三):华为 NPU/GPU 演进
  • 【Spring MVC 异常处理机制】应对意外情况
  • Pandas-数据分组
  • Seata AT 模式两阶段过程原理解析【seata AT模式如何做到对业务的无侵入】
  • 前端:轮播图常见的几种实现方式
  • CSS 实现无限滚动的列表
  • Unity+Hybridclr发布WebGL记录
  • 自动化运维脚本的最佳设计模式与开发指南
  • css的长度单位有那些?
  • 工业软件发展添动力 深圳龙华与华为云再聚“首”
  • Redis--缓存穿透、击穿、雪崩以及预热问题(面试高频问题!)
  • pytorch将数据与模型都放到GPU上训练
  • OpenGL ES 04 图片数据是怎么写入到对应纹理单元的
  • chatwoot 开源客服系统搭建
  • 安卓入门五 BroadcastReceiver
  • ARM/Linux嵌入式面经(六二):诺瓦星云
  • 年会投票小游戏
  • MySQL标准合规
  • 【ubuntu】安装OpenSSH服务器