Coreplus Web Server
基于fiber的http server
用于Host前端静态文件,基本上是webpack打包之后的dist文件
基础的能力:
- ✅SSO(CAS)[TODO:OAUTH2、内部认证中心]
- ✅CSRF 防护
- ✅流式文件处理,206
- 对接minio作为静态资源
运行
#二进制
cws --help
Coreplus Web Server
Usage:
cws [flags]
Flags:
-c, --config-file string 配置文件 (default "config/config.yaml")
-h, --help help for cws
#docker
docker run -d --name cws \
-p 80:80 \
-v /path/to/your/static/files:/app/static \
-v /path/to/config/file.yaml:/app/config/config.yaml \
registry.sudytech.com:35000/coreplus-webserver:0.0.3
中间件:authZ
如果采用sidecar或者有envoy的版本,请关闭此插件
按照envoy的external authZ协议实现本地将请求封装提交到后端的auth server
主要通过本插件实现IAP逻辑
authz:
enabled: false
routeMatchExpr: "/api/.*"
backend: 127.0.0.1:52001
# 如果grpc服务失败,是否拒绝 true:服务不存在或者失败忽略校验,false:服务不存在或者失败则拒绝
failover: false
includeBody: false
bodySizeInBytes: 0
中间件:cas代理
代理会根据配置转去SSO服务,完成登录后,会重写本域内的cookie
配置中设定了跳过SSO的路由前缀,请注意/a会包含/api,所以如果要针对具体的path,正确区分/a和/a/
authProxy:
enabled: false #是否启用
mode: cas #cas或者oauth2
cas:
baseUrl: http://test.sudytech.edu.cn/cas
loginUrl: http://test.sudytech.edu.cn/cas/login
logoutUrl: http://test.sudytech.edu.cn/cas/logout
validateUrl: http://test.sudytech.edu.cn/cas/serviceValidate
clientSecret: 28fbbc96-6171-4de7-89ca-454293f824cb
cookieName: _sop_session_
skipRoutePrefix:
- "/b"
对于开启了认证代理的路由,最终的请求必然会对cookie的jwt信息进行校验,这一点和jwt中间件无关
如果jwt验证失败,则返回500错误,不跳转到SSO的原因是防止死循环
中间件:jwt
jwt中间件是为了实现将cookie中的jwt信息解码成json,通过Header传递到upstream中
这样可以简化后端服务对认证信息的解码工作,直接从Header中提取响应的数据即可
jwt:
enabled: true
cookieName: _sop_session_
decoder: normal
secret: 28fbbc96-6171-4de7-89ca-454293f824cb
passHeaderName: X-User-Info
routes:
- /a/
decoder是解码器,默认是normal,对于内部认证中心或者能力网关的jwt解码将在后续补充
secret必须是jwt加密的key,如果jwt是SSO代理产生,需要和sso代理中配置的client_secret相同
jwt插件和SSO代理插件可以配合使用,但是并不强制,可以由应用或者7层代理产生cookie,通过jwt插件解码
TODO:增加对jwt信息的提取位置配置,可以是cookie,header的bearer或者url param
路由配置
路由支持:
- 内嵌资源
- 静态资源,例如webpack的编译产物,图片和视频
- 动态资源,这里主要是指upstream
routes:
- type: embed
prefix: "/welcome"
- type: static
backend: ./static
prefix: "/"
- type: dynamic
backend: "http://127.0.0.1:8000"
prefix: "/b"
stripPrefix: true
内嵌资源采用go 1.16的embed特性,需要在编译的时候将资源放入sui/webui,不支持运行时配置。
如果想要展示演示片,可以将webpack编译后的dist或者build目录复制进
路由的type包括static和dynamic
静态路由,backend是静态资源路径,prefix是路由,支持流式媒体
⚠️静态路由和内嵌资源可能存在潜在的冲突
由于通常前端资源都直接编译输出到/
,因此如果嵌入资源可能配置为/
之后,任何静态资源都会属于嵌入资源的范畴
所以我们建议将嵌入资源路由定义为**非/
路径,将/
路径交给static
除非我们的服务主要以api为主,这样可以把/
让给嵌入资源
动态路由,backend配置后端地址,stripPrefix指定是否在路由到upstream的时候对请求的原始url进行去前缀,例如:
请求的uri=/a/b?c=d
,设定stripPrefix=true,prefix=/a
路由到后端的请求uri为/b?c=d
由于本系统/x/
和/x
代表不同路由,因此在动态路由的配置上,为了避免/a
包含/api
的匹配规则,请谨慎设置prefix避免包含冲突。
通常路由的前缀设置采用长度优先规则,即最长的路由最前置