feat: add unified authorization middleware

This commit is contained in:
2026-08-12 11:46:48 +08:00
parent 2d1deb54f0
commit fa6898aef8
31 changed files with 341 additions and 490 deletions

View File

@@ -31,7 +31,14 @@ func main() {
config.New(ServiceKey) config.New(ServiceKey)
impl.NewImpl() impl.NewImpl()
srv := allserver.New() srv, err := allserver.New(
config.Spec.Authorization.Key,
config.Spec.Authorization.Expire,
config.Spec.Authorization.Anonymous,
)
if err != nil {
panic(err)
}
if err := service.Expose(srv); err != nil { if err := service.Expose(srv); err != nil {
panic(err) panic(err)
} }
@@ -45,7 +52,7 @@ func main() {
_ = srv.Stop(ctx) _ = srv.Stop(ctx)
}() }()
if err := srv.Start(config.Spec.Server.GRPC.Addr, config.Spec.Server.HTTP.Addr, config.Spec.DynamicRPC.Allow); err != nil && err != http.ErrServerClosed { if err := srv.Start(config.Spec.Server.GRPC.Addr, config.Spec.Server.HTTP.Addr); err != nil && err != http.ErrServerClosed {
panic(err) panic(err)
} }
} }

View File

@@ -7,12 +7,6 @@ Server:
BindIP: 0.0.0.0 BindIP: 0.0.0.0
Port: 12001 Port: 12001
# Dynamic JSON-to-protobuf unary RPC endpoint: POST /rpc/{module}/{service}/{method}
# An empty allow list denies every dynamic call. Use "*" to expose all
# reflection-visible unary methods, or list full service/method names.
DynamicRPC:
Allow:
- "*"
Databases: Databases:
Driver: postgres Driver: postgres
@@ -22,6 +16,32 @@ Databases:
Cache: redis://null:Weidong1214@127.0.0.1:6379/1 Cache: redis://null:Weidong1214@127.0.0.1:6379/1
SecretKey: CHANGE_ME SecretKey: CHANGE_ME
# Authorization contains the HS256 signing key and maximum token lifetime in
# seconds. Clients send the raw JWT in the Authorization header (no Bearer).
Authorization:
Key: CHANGE_ME_32_BYTE_JWT_SECRET_KEY
Expire: 86400
Anonymous:
- /passport.Login/Pwd
- /passport.Login/Code
- /passport.Login/Quick
- /passport.Register/Pwd
- /passport.Register/Code
- /passport.Forget/Verify
- /passport.Forget/Reset
- /passport.Verify/Request
- /passport.Verify/JumioCallback
- /market.Agency/Login
- /mall.Staff/Login
- /rest/fts/ping
- /rest/fts/config
- /rest/logs/ping
- /rest/mgt/ping
- /rest/mgt/session
- /rest/mgt/login
- /rest/mgt/refresh
- /rest/mgt/reset
# Enabled services. Use "all" to enable every registered service. # Enabled services. Use "all" to enable every registered service.
Services: Services:
- ads - ads

View File

@@ -52,7 +52,6 @@ require golang.org/x/net v0.57.0 // indirect
require ( require (
filippo.io/edwards25519 v1.2.0 // indirect filippo.io/edwards25519 v1.2.0 // indirect
github.com/KyleBanks/depth v1.2.1 // indirect
github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.5 // indirect github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.5 // indirect
github.com/alibabacloud-go/darabonba-openapi/v2 v2.2.4 // indirect github.com/alibabacloud-go/darabonba-openapi/v2 v2.2.4 // indirect
github.com/alibabacloud-go/debug v1.0.1 // indirect github.com/alibabacloud-go/debug v1.0.1 // indirect
@@ -72,16 +71,6 @@ require (
github.com/gabriel-vasile/mimetype v1.4.15 // indirect github.com/gabriel-vasile/mimetype v1.4.15 // indirect
github.com/gin-contrib/cors v1.7.7 // indirect github.com/gin-contrib/cors v1.7.7 // indirect
github.com/gin-contrib/sse v1.1.1 // indirect github.com/gin-contrib/sse v1.1.1 // indirect
github.com/go-openapi/jsonpointer v1.0.0 // indirect
github.com/go-openapi/jsonreference v1.0.0 // indirect
github.com/go-openapi/spec v0.22.9 // indirect
github.com/go-openapi/swag/conv v0.28.0 // indirect
github.com/go-openapi/swag/jsonutils v0.28.0 // indirect
github.com/go-openapi/swag/loading v0.28.0 // indirect
github.com/go-openapi/swag/pools v0.28.0 // indirect
github.com/go-openapi/swag/stringutils v0.28.0 // indirect
github.com/go-openapi/swag/typeutils v0.28.0 // indirect
github.com/go-openapi/swag/yamlutils v0.28.0 // indirect
github.com/go-pay/crypto v0.0.1 // indirect github.com/go-pay/crypto v0.0.1 // indirect
github.com/go-pay/errgroup v0.0.3 // indirect github.com/go-pay/errgroup v0.0.3 // indirect
github.com/go-pay/gopay v1.5.122 // indirect github.com/go-pay/gopay v1.5.122 // indirect
@@ -95,7 +84,7 @@ require (
github.com/go-sql-driver/mysql v1.10.0 // indirect github.com/go-sql-driver/mysql v1.10.0 // indirect
github.com/goccy/go-json v0.10.6 // indirect github.com/goccy/go-json v0.10.6 // indirect
github.com/goccy/go-yaml v1.19.2 // indirect github.com/goccy/go-yaml v1.19.2 // indirect
github.com/golang-jwt/jwt/v5 v5.3.1 // indirect github.com/golang-jwt/jwt/v5 v5.3.1
github.com/golang/protobuf v1.5.4 // indirect github.com/golang/protobuf v1.5.4 // indirect
github.com/google/uuid v1.6.0 // indirect github.com/google/uuid v1.6.0 // indirect
github.com/gorilla/context v1.1.2 // indirect github.com/gorilla/context v1.1.2 // indirect
@@ -128,9 +117,6 @@ require (
github.com/rs/xid v1.6.0 // indirect github.com/rs/xid v1.6.0 // indirect
github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e // indirect github.com/skip2/go-qrcode v0.0.0-20200617195104-da1b6568686e // indirect
github.com/spf13/cast v1.10.0 // indirect github.com/spf13/cast v1.10.0 // indirect
github.com/swaggo/files v1.0.1 // indirect
github.com/swaggo/gin-swagger v1.6.1 // indirect
github.com/swaggo/swag v1.16.6 // indirect
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.3.155 // indirect github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.3.155 // indirect
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/sms v1.3.155 // indirect github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/sms v1.3.155 // indirect
github.com/tinylib/msgp v1.6.4 // indirect github.com/tinylib/msgp v1.6.4 // indirect
@@ -146,11 +132,9 @@ require (
go.uber.org/zap v1.28.0 // indirect go.uber.org/zap v1.28.0 // indirect
golang.org/x/arch v0.30.0 // indirect golang.org/x/arch v0.30.0 // indirect
golang.org/x/crypto v0.54.0 // indirect golang.org/x/crypto v0.54.0 // indirect
golang.org/x/mod v0.38.0 // indirect
golang.org/x/sync v0.22.0 // indirect golang.org/x/sync v0.22.0 // indirect
golang.org/x/sys v0.47.0 // indirect golang.org/x/sys v0.47.0 // indirect
golang.org/x/text v0.40.0 // indirect golang.org/x/text v0.40.0 // indirect
golang.org/x/tools v0.48.0 // indirect
google.golang.org/genproto v0.0.0-20260807164820-c8921c73eeea google.golang.org/genproto v0.0.0-20260807164820-c8921c73eeea
google.golang.org/genproto/googleapis/api v0.0.0-20260807164820-c8921c73eeea // indirect google.golang.org/genproto/googleapis/api v0.0.0-20260807164820-c8921c73eeea // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20260807164820-c8921c73eeea // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20260807164820-c8921c73eeea // indirect

View File

@@ -2,8 +2,6 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMT
filippo.io/edwards25519 v1.2.0 h1:crnVqOiS4jqYleHd9vaKZ+HKtHfllngJIiOpNpoJsjo= filippo.io/edwards25519 v1.2.0 h1:crnVqOiS4jqYleHd9vaKZ+HKtHfllngJIiOpNpoJsjo=
filippo.io/edwards25519 v1.2.0/go.mod h1:xzAOLCNug/yB62zG1bQ8uziwrIqIuxhctzJT18Q77mc= filippo.io/edwards25519 v1.2.0/go.mod h1:xzAOLCNug/yB62zG1bQ8uziwrIqIuxhctzJT18Q77mc=
github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU=
github.com/KyleBanks/depth v1.2.1 h1:5h8fQADFrWtarTdtDudMmGsC7GPbOAu6RVB3ffsVFHc=
github.com/KyleBanks/depth v1.2.1/go.mod h1:jzSb9d0L43HxTQfT+oSA1EEp2q+ne2uh6XgeJcm8brE=
github.com/alibabacloud-go/alibabacloud-gateway-pop v0.0.6 h1:eIf+iGJxdU4U9ypaUfbtOWCsZSbTb8AUHvyPrxu6mAA= github.com/alibabacloud-go/alibabacloud-gateway-pop v0.0.6 h1:eIf+iGJxdU4U9ypaUfbtOWCsZSbTb8AUHvyPrxu6mAA=
github.com/alibabacloud-go/alibabacloud-gateway-pop v0.0.6/go.mod h1:4EUIoxs/do24zMOGGqYVWgw0s9NtiylnJglOeEB5UJo= github.com/alibabacloud-go/alibabacloud-gateway-pop v0.0.6/go.mod h1:4EUIoxs/do24zMOGGqYVWgw0s9NtiylnJglOeEB5UJo=
github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.4/go.mod h1:sCavSAvdzOjul4cEqeVtvlSaSScfNsTQ+46HwlTL1hc= github.com/alibabacloud-go/alibabacloud-gateway-spi v0.0.4/go.mod h1:sCavSAvdzOjul4cEqeVtvlSaSScfNsTQ+46HwlTL1hc=
@@ -94,8 +92,6 @@ github.com/gabriel-vasile/mimetype v1.4.15 h1:05iP/CYtZ/w455R/KZM6rZ5ieAdh99UPtd
github.com/gabriel-vasile/mimetype v1.4.15/go.mod h1:azpTcoLcDZRNgFou5j+APrqQx9HqVPWa6ijYQIIVswQ= github.com/gabriel-vasile/mimetype v1.4.15/go.mod h1:azpTcoLcDZRNgFou5j+APrqQx9HqVPWa6ijYQIIVswQ=
github.com/gin-contrib/cors v1.7.7 h1:Oh9joP463x7Mw72vhvJ61YQm8ODh9b04YR7vsOErD0Q= github.com/gin-contrib/cors v1.7.7 h1:Oh9joP463x7Mw72vhvJ61YQm8ODh9b04YR7vsOErD0Q=
github.com/gin-contrib/cors v1.7.7/go.mod h1:K5tW0RkzJtWSiOdikXloy8VEZlgdVNpHNw8FpjUPNrE= github.com/gin-contrib/cors v1.7.7/go.mod h1:K5tW0RkzJtWSiOdikXloy8VEZlgdVNpHNw8FpjUPNrE=
github.com/gin-contrib/gzip v0.0.6 h1:NjcunTcGAj5CO1gn4N8jHOSIeRFHIbn51z6K+xaN4d4=
github.com/gin-contrib/gzip v0.0.6/go.mod h1:QOJlmV2xmayAjkNS2Y8NQsMneuRShOU/kjovCXNuzzk=
github.com/gin-contrib/sessions v1.1.0 h1:00mhHfNEGF5sP2fwxa98aRqj1FOJdL6IkR86n2hOiBo= github.com/gin-contrib/sessions v1.1.0 h1:00mhHfNEGF5sP2fwxa98aRqj1FOJdL6IkR86n2hOiBo=
github.com/gin-contrib/sessions v1.1.0/go.mod h1:TyYZDIs6qCQg2SOoYPgMT9pAkmZceVNEJMcv5qbIy60= github.com/gin-contrib/sessions v1.1.0/go.mod h1:TyYZDIs6qCQg2SOoYPgMT9pAkmZceVNEJMcv5qbIy60=
github.com/gin-contrib/sse v1.1.1 h1:uGYpNwTacv5R68bSGMapo62iLTRa9l5zxGCps4hK6ko= github.com/gin-contrib/sse v1.1.1 h1:uGYpNwTacv5R68bSGMapo62iLTRa9l5zxGCps4hK6ko=
@@ -106,33 +102,6 @@ github.com/go-logr/logr v1.4.4 h1:tG4xh9yMsRCAiodLVTxyrkzSZ9+o0L1Kg/+cPVcbP/8=
github.com/go-logr/logr v1.4.4/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/logr v1.4.4/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
github.com/go-openapi/jsonpointer v1.0.0 h1:kR9tHqY0CtZaOPVFm622dPVNhrvYpwr4uCxgL3h1H8s=
github.com/go-openapi/jsonpointer v1.0.0/go.mod h1:Z3rw7dWu1p9IgitXCFamSlA5lmDiklEB6vkaxcNZW5Y=
github.com/go-openapi/jsonreference v1.0.0 h1:jlmTr6torcd1YgDQvSfNmRtKzYDO4FGBkrAdlAVWnpY=
github.com/go-openapi/jsonreference v1.0.0/go.mod h1:jtwdyGbJk0Xhe5Y+rwtglQP6Sb1WZST4rT32LWB+sv0=
github.com/go-openapi/spec v0.22.9 h1:/vKIFDcGKp0ktZWGbym/tJEWbk6/XOEmAVU0kqKMH+w=
github.com/go-openapi/spec v0.22.9/go.mod h1:b/mNUYIOQOyIiUzUzXEE8xzyZqf93KvM9hQGP91yfl0=
github.com/go-openapi/swag v0.28.0 h1:xkgbOSKj6DZziNpyqRRAOt3GJGtgjgsd2RoyT30VWuw=
github.com/go-openapi/swag/conv v0.28.0 h1:GtqqbyFe7vR5Y7ehxG9W6/OvrSFdf1OLeTGp40TqxH8=
github.com/go-openapi/swag/conv v0.28.0/go.mod h1:mbUE+mzctnhxi864m0Q07SpN8OowD9JhxmxuYvZZD/k=
github.com/go-openapi/swag/jsonutils v0.28.0 h1:YIch6FwO7RXzeAnbO8Tu7dWBZeUEH+4nA0HXltVTnv4=
github.com/go-openapi/swag/jsonutils v0.28.0/go.mod h1:CYM3WlTUcagR2ZoHdz54di/cbBqt82tuxuXgAjxw+mg=
github.com/go-openapi/swag/jsonutils/fixtures_test v0.28.0 h1:qV+VVUAx5Oro8WjVWpZeql7YReTKhT4smR4zhcOQZr0=
github.com/go-openapi/swag/jsonutils/fixtures_test v0.28.0/go.mod h1:mofwUWx70wvskwESqRJ//k/9kURmCgyJl5m5Ppoh5kY=
github.com/go-openapi/swag/loading v0.28.0 h1:td8QZdZC9MIYGGSnSPKShKiK22I2tU5UQvuUhIBPRLU=
github.com/go-openapi/swag/loading v0.28.0/go.mod h1:rXB0QiQX5mMveXEA7ouM4KiiM9jVJe4K6BVbwhD1M4k=
github.com/go-openapi/swag/pools v0.28.0 h1:HPMZWSAfce3rdVTFcjFiCIBtDg9h4x2QlRrHipwhxeU=
github.com/go-openapi/swag/pools v0.28.0/go.mod h1:kVQefhSK5RWuRe7BXsL8htgBPAMpN7HDGpGEknqugeE=
github.com/go-openapi/swag/stringutils v0.28.0 h1:ixsc9iYgDPubHL/8nSkbnryEHpD2VRlBMLKpQyPXcDU=
github.com/go-openapi/swag/stringutils v0.28.0/go.mod h1:lzRN95CxXmA03XcDWHLOb6nOMcxCqR5rGY0lOgsfRoM=
github.com/go-openapi/swag/typeutils v0.28.0 h1:nRBKSBXjDgf01VDPB3fWeD9nQuhCOVeIYAkUx2tbkyY=
github.com/go-openapi/swag/typeutils v0.28.0/go.mod h1:Srm0xFNRZ1Y+vCxJclo5qzx8aj+1pAKda/YfFPrG0dQ=
github.com/go-openapi/swag/yamlutils v0.28.0 h1:TV3JXH6DS46KUroDtMLAYHGkdWf5VDq3wVWFirmzROY=
github.com/go-openapi/swag/yamlutils v0.28.0/go.mod h1:x0q/yndZHEgk9Rx3DyDqzFUmHy55KTvIZldvF2dTJXs=
github.com/go-openapi/testify/enable/yaml/v2 v2.6.0 h1:gGHwAJ0R/5jU8BEGDbfRNR3hL68dAVi84WuOApp29B0=
github.com/go-openapi/testify/enable/yaml/v2 v2.6.0/go.mod h1:tY+St1SGq4NFl0QIqdTY4aEdbChAHxhyB77XQi9iJCo=
github.com/go-openapi/testify/v2 v2.6.0 h1:5PKH2HE7YJ/LuRPQGvSxBRlFXNQhSetBLlGAgUEu3ug=
github.com/go-openapi/testify/v2 v2.6.0/go.mod h1:SgsVHtfooshd0tublTtJ50FPKhujf47YRqauXXOUxfw=
github.com/go-pay/crypto v0.0.1 h1:B6InT8CLfSLc6nGRVx9VMJRBBazFMjr293+jl0lLXUY= github.com/go-pay/crypto v0.0.1 h1:B6InT8CLfSLc6nGRVx9VMJRBBazFMjr293+jl0lLXUY=
github.com/go-pay/crypto v0.0.1/go.mod h1:41oEIvHMKbNcYlWUlRWtsnC6+ASgh7u29z0gJXe5bes= github.com/go-pay/crypto v0.0.1/go.mod h1:41oEIvHMKbNcYlWUlRWtsnC6+ASgh7u29z0gJXe5bes=
github.com/go-pay/errgroup v0.0.3 h1:DB4s8e8oWYDyETKQ1y1riMJ7y29zE1uIsMCSjEOFSbU= github.com/go-pay/errgroup v0.0.3 h1:DB4s8e8oWYDyETKQ1y1riMJ7y29zE1uIsMCSjEOFSbU=
@@ -295,12 +264,6 @@ github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXl
github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U= github.com/stretchr/testify v1.11.1 h1:7s2iGBzp5EwR7/aIZr8ao5+dra3wiQyKjjFuvgVKu7U=
github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U= github.com/stretchr/testify v1.11.1/go.mod h1:wZwfW3scLgRK+23gO65QZefKpKQRnfz6sD981Nm4B6U=
github.com/swaggo/files v1.0.1 h1:J1bVJ4XHZNq0I46UU90611i9/YzdrF7x92oX1ig5IdE=
github.com/swaggo/files v1.0.1/go.mod h1:0qXmMNH6sXNf+73t65aKeB+ApmgxdnkQzVTAj2uaMUg=
github.com/swaggo/gin-swagger v1.6.1 h1:Ri06G4gc9N4t4k8hekMigJ9zKTFSlqj/9paAQCQs7cY=
github.com/swaggo/gin-swagger v1.6.1/go.mod h1:LQ+hJStHakCWRiK/YNYtJOu4mR2FP+pxLnILT/qNiTw=
github.com/swaggo/swag v1.16.6 h1:qBNcx53ZaX+M5dxVyTrgQ0PJ/ACK+NzhwcbieTt+9yI=
github.com/swaggo/swag v1.16.6/go.mod h1:ngP2etMK5a0P3QBizic5MEwpRmluJZPHjXcMoj4Xesg=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.3.155 h1:142i5n5u0TcSyJM8YrQNPq1owhD7cXMvvWM45+BcrK0= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.3.155 h1:142i5n5u0TcSyJM8YrQNPq1owhD7cXMvvWM45+BcrK0=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.3.155/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.3.155/go.mod h1:r5r4xbfxSaeR04b166HGsBa/R4U3SueirEUpXGuw+Q0=
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/sms v1.3.155 h1:MbrQONH8U74mKsa9aRhEnTYNhJBQfnGHQKMN8OEp9aE= github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/sms v1.3.155 h1:MbrQONH8U74mKsa9aRhEnTYNhJBQfnGHQKMN8OEp9aE=
@@ -381,8 +344,6 @@ golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/mod v0.12.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs=
golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/mod v0.15.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c=
golang.org/x/mod v0.38.0 h1:MECBjubtXD7yj4HrhIUcywNaGeNVUdfVnxmPajOk4yk=
golang.org/x/mod v0.38.0/go.mod h1:V6Xz0pq8TQ3dGqVQ1FVHuelZpAL0uNhSkk9ogYP3c40=
golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190213061140-3a22650c66bd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
@@ -476,8 +437,6 @@ golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc
golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU=
golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58=
golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk=
golang.org/x/tools v0.48.0 h1:3+hClM1aLL5mjMKm5ovokw9epgRXPuu2tILgismM6RE=
golang.org/x/tools v0.48.0/go.mod h1:08xX0orndb/F7jJxGDicx061tyd5pcMto75YMAXr6lk=
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
@@ -487,8 +446,6 @@ google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9Ywl
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc= google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
google.golang.org/genproto v0.0.0-20260807164820-c8921c73eeea h1:EoNao6AiKb+bftjR8vFOxqtY1A4zLnvnfea+FBQicBo=
google.golang.org/genproto v0.0.0-20260807164820-c8921c73eeea/go.mod h1:MVqdGj2rFowpxM1nWJoGZmKI3TGThZsWENFz9uc4l1g=
google.golang.org/genproto/googleapis/api v0.0.0-20260807164820-c8921c73eeea h1:Jifw/kjs/r3B0uszvls/m3c3tmZs2YHGM9C+rvxP9gY= google.golang.org/genproto/googleapis/api v0.0.0-20260807164820-c8921c73eeea h1:Jifw/kjs/r3B0uszvls/m3c3tmZs2YHGM9C+rvxP9gY=
google.golang.org/genproto/googleapis/api v0.0.0-20260807164820-c8921c73eeea/go.mod h1:K/+WGbmBY7aNW1HDw1fJnKYo10i0DkAX6pows00dLig= google.golang.org/genproto/googleapis/api v0.0.0-20260807164820-c8921c73eeea/go.mod h1:K/+WGbmBY7aNW1HDw1fJnKYo10i0DkAX6pows00dLig=
google.golang.org/genproto/googleapis/rpc v0.0.0-20260807164820-c8921c73eeea h1:kVhQEPTpKQahD5+JSBTfBB19wcgQTTjAIn45MBqnyHk= google.golang.org/genproto/googleapis/rpc v0.0.0-20260807164820-c8921c73eeea h1:kVhQEPTpKQahD5+JSBTfBB19wcgQTTjAIn45MBqnyHk=

View File

@@ -4,6 +4,7 @@ import (
"net" "net"
"os" "os"
"strings" "strings"
"time"
ftsService "bsm/full/module/base/fts/service" ftsService "bsm/full/module/base/fts/service"
mgtService "bsm/full/module/base/mgt/service" mgtService "bsm/full/module/base/mgt/service"
@@ -11,24 +12,26 @@ import (
senderService "bsm/full/module/base/sender/service" senderService "bsm/full/module/base/sender/service"
walletService "bsm/full/module/finance/wallet/service" walletService "bsm/full/module/finance/wallet/service"
"git.apinb.com/bsm-sdk/core/conf" "git.apinb.com/bsm-sdk/core/conf"
"git.apinb.com/bsm-sdk/core/env"
"git.apinb.com/bsm-sdk/core/printer" "git.apinb.com/bsm-sdk/core/printer"
coreVars "git.apinb.com/bsm-sdk/core/vars"
) )
type SrvConfig struct { type SrvConfig struct {
conf.Base `yaml:",inline"` conf.Base `yaml:",inline"`
Server ServerConfig `yaml:"Server"` Server ServerConfig `yaml:"Server"`
DynamicRPC DynamicRPCConfig `yaml:"DynamicRPC"` Authorization AuthorizationConfig `yaml:"Authorization"`
Databases *conf.DBConf `yaml:"Databases"` Databases *conf.DBConf `yaml:"Databases"`
MicroService *conf.MicroServiceConf `yaml:"MicroService"` MicroService *conf.MicroServiceConf `yaml:"MicroService"`
Rpc map[string]conf.RpcConf `yaml:"Rpc"` Rpc map[string]conf.RpcConf `yaml:"Rpc"`
Apm *conf.ApmConf `yaml:"APM"` Apm *conf.ApmConf `yaml:"APM"`
Etcd *conf.EtcdConf `yaml:"Etcd"` Etcd *conf.EtcdConf `yaml:"Etcd"`
Services []string `yaml:"Services"` Services []string `yaml:"Services"`
Fts *ftsService.Config `yaml:"Fts"` Fts *ftsService.Config `yaml:"Fts"`
Mgt *mgtService.Config `yaml:"Mgt"` Mgt *mgtService.Config `yaml:"Mgt"`
Passport *passportService.Config `yaml:"Passport"` Passport *passportService.Config `yaml:"Passport"`
Sender *senderService.Config `yaml:"Sender"` Sender *senderService.Config `yaml:"Sender"`
Wallet *walletService.Config `yaml:"Wallet"` Wallet *walletService.Config `yaml:"Wallet"`
} }
type ListenerConfig struct { type ListenerConfig struct {
@@ -42,8 +45,10 @@ type ServerConfig struct {
HTTP ListenerConfig `yaml:"HTTP"` HTTP ListenerConfig `yaml:"HTTP"`
} }
type DynamicRPCConfig struct { type AuthorizationConfig struct {
Allow []string `yaml:"Allow"` Key string `yaml:"Key"`
Expire int64 `yaml:"Expire"`
Anonymous []string `yaml:"Anonymous"`
} }
var Spec SrvConfig var Spec SrvConfig
@@ -55,6 +60,18 @@ func New(serviceKey string) {
if Spec.Server.GRPC.Addr == Spec.Server.HTTP.Addr { if Spec.Server.GRPC.Addr == Spec.Server.HTTP.Addr {
panic("gRPC and HTTP listeners must use different addresses") panic("gRPC and HTTP listeners must use different addresses")
} }
if strings.TrimSpace(Spec.Authorization.Key) == "" {
panic("Authorization.Key must not be empty")
}
keyLength := len(Spec.Authorization.Key)
if keyLength != 16 && keyLength != 24 && keyLength != 32 {
panic("Authorization.Key must contain 16, 24, or 32 bytes")
}
if Spec.Authorization.Expire <= 0 {
panic("Authorization.Expire must be greater than zero")
}
env.NewEnv().JwtSecretKey = Spec.Authorization.Key
coreVars.JwtExpire = time.Duration(Spec.Authorization.Expire) * time.Second
// Keep the embedded base address meaningful for module configurations that // Keep the embedded base address meaningful for module configurations that
// still consume it, while all itself uses the two explicit listeners. // still consume it, while all itself uses the two explicit listeners.
Spec.BindIP, Spec.Port, Spec.Addr = Spec.Server.HTTP.BindIP, Spec.Server.HTTP.Port, Spec.Server.HTTP.Addr Spec.BindIP, Spec.Port, Spec.Addr = Spec.Server.HTTP.BindIP, Spec.Server.HTTP.Port, Spec.Server.HTTP.Addr

View File

@@ -23,8 +23,12 @@ func TestAllDevConfig(t *testing.T) {
if cfg.Server.GRPC.Port == "" || cfg.Server.HTTP.Port == "" || cfg.Server.GRPC.Port == cfg.Server.HTTP.Port { if cfg.Server.GRPC.Port == "" || cfg.Server.HTTP.Port == "" || cfg.Server.GRPC.Port == cfg.Server.HTTP.Port {
t.Fatal("separate gRPC and HTTP ports are required") t.Fatal("separate gRPC and HTTP ports are required")
} }
if len(cfg.DynamicRPC.Allow) == 0 { if cfg.Authorization.Key == "" || cfg.Authorization.Expire <= 0 {
t.Fatal("dynamic RPC allow list must be explicit") t.Fatal("authorization key and expiration are required")
}
keyLength := len(cfg.Authorization.Key)
if keyLength != 16 && keyLength != 24 && keyLength != 32 {
t.Fatal("authorization key must be compatible with the JWT issuer")
} }
if cfg.Fts == nil || cfg.Mgt == nil || cfg.Passport == nil || cfg.Sender == nil || cfg.Wallet == nil { if cfg.Fts == nil || cfg.Mgt == nil || cfg.Passport == nil || cfg.Sender == nil || cfg.Wallet == nil {
t.Fatal("service-specific configuration is incomplete") t.Fatal("service-specific configuration is incomplete")

View File

@@ -0,0 +1,123 @@
package server
import (
"context"
"errors"
"fmt"
"net/http"
"path"
"strings"
"time"
"github.com/golang-jwt/jwt/v5"
"google.golang.org/grpc"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/metadata"
"google.golang.org/grpc/status"
)
type authorization struct {
key []byte
expire time.Duration
anonymous map[string]struct{}
}
func newAuthorization(key string, expireSeconds int64, anonymous []string) (*authorization, error) {
key = strings.TrimSpace(key)
if key == "" {
return nil, errors.New("authorization key must not be empty")
}
if expireSeconds <= 0 {
return nil, errors.New("authorization expiration must be greater than zero")
}
allowed := make(map[string]struct{}, len(anonymous))
for _, item := range anonymous {
if item = normalizePath(item); item != "" {
allowed[item] = struct{}{}
}
}
return &authorization{key: []byte(key), expire: time.Duration(expireSeconds) * time.Second, anonymous: allowed}, nil
}
func (a *authorization) unaryInterceptor(ctx context.Context, req any, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (any, error) {
if !a.isAnonymous(info.FullMethod) {
values := metadata.ValueFromIncomingContext(ctx, "authorization")
if len(values) == 0 {
return nil, status.Error(codes.Unauthenticated, "authorization is required")
}
if err := a.validate(values[0]); err != nil {
return nil, status.Error(codes.Unauthenticated, err.Error())
}
}
return handler(ctx, req)
}
func (a *authorization) httpMiddleware(next http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
requestPath := canonicalHTTPPath(r.URL.Path)
if !a.isAnonymous(requestPath) {
if err := a.validate(r.Header.Get("Authorization")); err != nil {
writeHTTPAuthorizationError(w, err)
return
}
}
next.ServeHTTP(w, r)
})
}
func (a *authorization) validate(raw string) error {
raw = strings.TrimSpace(raw)
if raw == "" {
return errors.New("authorization is required")
}
claims := &jwt.RegisteredClaims{}
tokenValue, err := jwt.ParseWithClaims(raw, claims, func(tokenValue *jwt.Token) (any, error) {
if tokenValue.Method != jwt.SigningMethodHS256 {
return nil, fmt.Errorf("unexpected signing method: %s", tokenValue.Method.Alg())
}
return a.key, nil
}, jwt.WithExpirationRequired(), jwt.WithIssuedAt(), jwt.WithValidMethods([]string{jwt.SigningMethodHS256.Alg()}))
if err != nil || !tokenValue.Valid {
return errors.New("authorization is invalid or expired")
}
if claims.IssuedAt == nil {
return errors.New("authorization issued-at is required")
}
now := time.Now()
if claims.IssuedAt.Time.After(now) || now.Sub(claims.IssuedAt.Time) > a.expire {
return errors.New("authorization is expired")
}
return nil
}
func (a *authorization) isAnonymous(requestPath string) bool {
requestPath = normalizePath(requestPath)
if strings.HasPrefix(requestPath, "/grpc.reflection.") || strings.HasPrefix(requestPath, "/grpc.health.") {
return true
}
_, ok := a.anonymous[requestPath]
return ok
}
func canonicalHTTPPath(requestPath string) string {
normalized := normalizePath(requestPath)
parts := strings.Split(strings.TrimPrefix(normalized, "/"), "/")
if len(parts) == 4 && parts[0] == "rpc" {
return "/" + parts[1] + "." + parts[2] + "/" + parts[3]
}
return normalized
}
func normalizePath(value string) string {
value = strings.TrimSpace(value)
if value == "" {
return ""
}
return path.Clean("/" + strings.TrimPrefix(value, "/"))
}
func writeHTTPAuthorizationError(w http.ResponseWriter, err error) {
w.Header().Set("Content-Type", "application/json; charset=utf-8")
w.WriteHeader(http.StatusOK)
_, _ = fmt.Fprintf(w, `{"code":%d,"message":%q}`, codes.Unauthenticated, err.Error())
}

View File

@@ -0,0 +1,100 @@
package server
import (
"context"
"net/http"
"net/http/httptest"
"strings"
"testing"
"time"
"github.com/golang-jwt/jwt/v5"
"google.golang.org/grpc"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/metadata"
"google.golang.org/grpc/status"
)
const testAuthorizationKey = "0123456789abcdef0123456789abcdef"
func TestHTTPAuthorization(t *testing.T) {
auth, err := newAuthorization(testAuthorizationKey, 3600, []string{"/passport.Login/Pwd", "/rest/fts/ping"})
if err != nil {
t.Fatal(err)
}
next := http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) { w.WriteHeader(http.StatusNoContent) })
handler := auth.httpMiddleware(next)
tests := []struct {
name string
path string
token string
want int
}{
{name: "grpc gateway anonymous", path: "/passport.Login/Pwd", want: http.StatusNoContent},
{name: "dynamic rpc anonymous", path: "/rpc/passport/Login/Pwd", want: http.StatusNoContent},
{name: "rest anonymous", path: "/rest/fts/ping", want: http.StatusNoContent},
{name: "missing token", path: "/passport.Account/Get", want: http.StatusOK},
{name: "valid raw token", path: "/passport.Account/Get", token: signedToken(t, time.Now(), time.Now().Add(time.Hour)), want: http.StatusNoContent},
{name: "bearer rejected", path: "/passport.Account/Get", token: "Bearer " + signedToken(t, time.Now(), time.Now().Add(time.Hour)), want: http.StatusOK},
}
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
request := httptest.NewRequest(http.MethodPost, test.path, nil)
if test.token != "" {
request.Header.Set("Authorization", test.token)
}
response := httptest.NewRecorder()
handler.ServeHTTP(response, request)
if response.Code != test.want {
t.Fatalf("status=%d body=%s", response.Code, response.Body.String())
}
if test.want == http.StatusOK && !strings.Contains(response.Body.String(), `"code":16`) {
t.Fatalf("unexpected authorization error: %s", response.Body.String())
}
})
}
}
func TestAuthorizationRejectsTokenOlderThanConfiguredLifetime(t *testing.T) {
auth, err := newAuthorization(testAuthorizationKey, 60, nil)
if err != nil {
t.Fatal(err)
}
if err := auth.validate(signedToken(t, time.Now().Add(-2*time.Minute), time.Now().Add(time.Hour))); err == nil {
t.Fatal("expected token older than configured lifetime to be rejected")
}
}
func TestGRPCAuthorization(t *testing.T) {
auth, err := newAuthorization(testAuthorizationKey, 3600, []string{"/passport.Login/Pwd"})
if err != nil {
t.Fatal(err)
}
handler := func(context.Context, any) (any, error) { return "ok", nil }
if _, err := auth.unaryInterceptor(context.Background(), nil, &grpc.UnaryServerInfo{FullMethod: "/passport.Login/Pwd"}, handler); err != nil {
t.Fatalf("anonymous method failed: %v", err)
}
if _, err := auth.unaryInterceptor(context.Background(), nil, &grpc.UnaryServerInfo{FullMethod: "/passport.Account/Get"}, handler); status.Code(err) != codes.Unauthenticated {
t.Fatalf("expected unauthenticated, got %v", err)
}
ctx := metadata.NewIncomingContext(context.Background(), metadata.Pairs("authorization", signedToken(t, time.Now(), time.Now().Add(time.Hour))))
if _, err := auth.unaryInterceptor(ctx, nil, &grpc.UnaryServerInfo{FullMethod: "/passport.Account/Get"}, handler); err != nil {
t.Fatalf("valid token failed: %v", err)
}
}
func signedToken(t *testing.T, issuedAt, expiresAt time.Time) string {
t.Helper()
claims := jwt.RegisteredClaims{
IssuedAt: jwt.NewNumericDate(issuedAt),
NotBefore: jwt.NewNumericDate(issuedAt),
ExpiresAt: jwt.NewNumericDate(expiresAt),
}
value, err := jwt.NewWithClaims(jwt.SigningMethodHS256, claims).SignedString([]byte(testAuthorizationKey))
if err != nil {
t.Fatal(err)
}
return value
}

View File

@@ -30,7 +30,6 @@ const maxDynamicRPCBody = 4 << 20
type dynamicGateway struct { type dynamicGateway struct {
conn *grpc.ClientConn conn *grpc.ClientConn
allow map[string]struct{}
mu sync.RWMutex mu sync.RWMutex
cache map[string]protoreflect.MethodDescriptor cache map[string]protoreflect.MethodDescriptor
} }
@@ -42,18 +41,12 @@ type dynamicRPCResponse struct {
Details []json.RawMessage `json:"details,omitempty"` Details []json.RawMessage `json:"details,omitempty"`
} }
func newDynamicGateway(grpcAddr string, allow []string) (*dynamicGateway, error) { func newDynamicGateway(grpcAddr string) (*dynamicGateway, error) {
conn, err := grpc.NewClient(reflectionTarget(grpcAddr), grpc.WithTransportCredentials(insecure.NewCredentials())) conn, err := grpc.NewClient(reflectionTarget(grpcAddr), grpc.WithTransportCredentials(insecure.NewCredentials()))
if err != nil { if err != nil {
return nil, fmt.Errorf("create dynamic gRPC client: %w", err) return nil, fmt.Errorf("create dynamic gRPC client: %w", err)
} }
allowed := make(map[string]struct{}, len(allow)) return &dynamicGateway{conn: conn, cache: make(map[string]protoreflect.MethodDescriptor)}, nil
for _, item := range allow {
if item = strings.TrimSpace(item); item != "" {
allowed[item] = struct{}{}
}
}
return &dynamicGateway{conn: conn, allow: allowed, cache: make(map[string]protoreflect.MethodDescriptor)}, nil
} }
func reflectionTarget(addr string) string { func reflectionTarget(addr string) string {
@@ -78,12 +71,6 @@ func (g *dynamicGateway) handle(c *gin.Context) {
return return
} }
serviceName := moduleName + "." + serviceShortName serviceName := moduleName + "." + serviceShortName
fullMethod := serviceName + "." + methodName
if !g.isAllowed(serviceName, fullMethod) {
writeDynamicError(c, status.Error(codes.PermissionDenied, "dynamic RPC method is not allowed"))
return
}
descriptor, err := g.resolveMethod(c.Request.Context(), serviceName, methodName) descriptor, err := g.resolveMethod(c.Request.Context(), serviceName, methodName)
if err != nil { if err != nil {
writeDynamicError(c, err) writeDynamicError(c, err)
@@ -125,15 +112,6 @@ func (g *dynamicGateway) handle(c *gin.Context) {
c.JSON(http.StatusOK, dynamicRPCResponse{Code: int32(codes.OK), Message: codes.OK.String(), Data: data}) c.JSON(http.StatusOK, dynamicRPCResponse{Code: int32(codes.OK), Message: codes.OK.String(), Data: data})
} }
func (g *dynamicGateway) isAllowed(serviceName, fullMethod string) bool {
for _, key := range []string{"*", serviceName, fullMethod} {
if _, ok := g.allow[key]; ok {
return true
}
}
return false
}
func (g *dynamicGateway) resolveMethod(ctx context.Context, serviceName, methodName string) (protoreflect.MethodDescriptor, error) { func (g *dynamicGateway) resolveMethod(ctx context.Context, serviceName, methodName string) (protoreflect.MethodDescriptor, error) {
cacheKey := serviceName + "." + methodName cacheKey := serviceName + "." + methodName
g.mu.RLock() g.mu.RLock()

View File

@@ -10,7 +10,6 @@ import (
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"google.golang.org/grpc" "google.golang.org/grpc"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/health" "google.golang.org/grpc/health"
healthpb "google.golang.org/grpc/health/grpc_health_v1" healthpb "google.golang.org/grpc/health/grpc_health_v1"
"google.golang.org/grpc/metadata" "google.golang.org/grpc/metadata"
@@ -33,7 +32,7 @@ func TestDynamicGatewayInvokesUnaryRPC(t *testing.T) {
_ = listener.Close() _ = listener.Close()
}) })
gateway, err := newDynamicGateway(listener.Addr().String(), []string{"grpc.health.v1.Health.Check"}) gateway, err := newDynamicGateway(listener.Addr().String())
if err != nil { if err != nil {
t.Fatal(err) t.Fatal(err)
} }
@@ -61,26 +60,6 @@ func TestDynamicGatewayInvokesUnaryRPC(t *testing.T) {
} }
} }
func TestDynamicGatewayDeniesMethodsByDefault(t *testing.T) {
gateway := &dynamicGateway{allow: map[string]struct{}{}}
gin.SetMode(gin.TestMode)
engine := gin.New()
engine.POST("/rpc/:module/:service/:method", gateway.handle)
request := httptest.NewRequest(http.MethodPost, "/rpc/grpc.health.v1/Health/Check", strings.NewReader(`{}`))
response := httptest.NewRecorder()
engine.ServeHTTP(response, request)
if response.Code != http.StatusOK {
t.Fatalf("dynamic RPC errors must use HTTP 200, got %d", response.Code)
}
var payload dynamicRPCResponse
if err := json.Unmarshal(response.Body.Bytes(), &payload); err != nil {
t.Fatal(err)
}
if payload.Code != int32(codes.PermissionDenied) {
t.Fatalf("expected permission denied, got %s", response.Body.String())
}
}
func TestOutgoingMetadataFiltersHeaders(t *testing.T) { func TestOutgoingMetadataFiltersHeaders(t *testing.T) {
request := httptest.NewRequest(http.MethodPost, "/", nil) request := httptest.NewRequest(http.MethodPost, "/", nil)
request.Header.Set("Authorization", "Bearer token") request.Header.Set("Authorization", "Bearer token")

View File

@@ -21,10 +21,15 @@ type Server struct {
HTTP *gin.Engine HTTP *gin.Engine
http *http.Server http *http.Server
dynamic *dynamicGateway dynamic *dynamicGateway
auth *authorization
} }
func New() *Server { func New(key string, expireSeconds int64, anonymous []string) (*Server, error) {
grpcServer := grpc.NewServer() auth, err := newAuthorization(key, expireSeconds, anonymous)
if err != nil {
return nil, err
}
grpcServer := grpc.NewServer(grpc.UnaryInterceptor(auth.unaryInterceptor))
reflection.Register(grpcServer) reflection.Register(grpcServer)
engine := gin.New() engine := gin.New()
engine.Use(gin.Logger(), gin.Recovery()) engine.Use(gin.Logger(), gin.Recovery())
@@ -32,10 +37,11 @@ func New() *Server {
GRPC: grpcServer, GRPC: grpcServer,
Gateway: gwRuntime.NewServeMux(), Gateway: gwRuntime.NewServeMux(),
HTTP: engine, HTTP: engine,
} auth: auth,
}, nil
} }
func (s *Server) Start(grpcAddr, httpAddr string, allow []string) error { func (s *Server) Start(grpcAddr, httpAddr string) error {
grpcListener, err := net.Listen("tcp", grpcAddr) grpcListener, err := net.Listen("tcp", grpcAddr)
if err != nil { if err != nil {
return fmt.Errorf("listen gRPC on %s: %w", grpcAddr, err) return fmt.Errorf("listen gRPC on %s: %w", grpcAddr, err)
@@ -46,7 +52,7 @@ func (s *Server) Start(grpcAddr, httpAddr string, allow []string) error {
return fmt.Errorf("listen HTTP on %s: %w", httpAddr, err) return fmt.Errorf("listen HTTP on %s: %w", httpAddr, err)
} }
s.dynamic, err = newDynamicGateway(grpcAddr, allow) s.dynamic, err = newDynamicGateway(grpcAddr)
if err != nil { if err != nil {
_ = grpcListener.Close() _ = grpcListener.Close()
_ = httpListener.Close() _ = httpListener.Close()
@@ -65,7 +71,7 @@ func (s *Server) Start(grpcAddr, httpAddr string, allow []string) error {
}) })
s.http = &http.Server{ s.http = &http.Server{
Addr: httpAddr, Addr: httpAddr,
Handler: handler, Handler: s.auth.httpMiddleware(handler),
ReadHeaderTimeout: 10 * time.Second, ReadHeaderTimeout: 10 * time.Second,
IdleTimeout: 120 * time.Second, IdleTimeout: 120 * time.Second,
MaxHeaderBytes: 1 << 20, MaxHeaderBytes: 1 << 20,

View File

@@ -9,7 +9,10 @@ import (
) )
func TestHTTPRouterIsAvailable(t *testing.T) { func TestHTTPRouterIsAvailable(t *testing.T) {
srv := New() srv, err := New("0123456789abcdef0123456789abcdef", 3600, []string{"/healthz"})
if err != nil {
t.Fatal(err)
}
srv.HTTP.GET("/healthz", func(c *gin.Context) { c.Status(http.StatusNoContent) }) srv.HTTP.GET("/healthz", func(c *gin.Context) { c.Status(http.StatusNoContent) })
request := httptest.NewRequest(http.MethodGet, "/healthz", nil) request := httptest.NewRequest(http.MethodGet, "/healthz", nil)

View File

@@ -90,7 +90,7 @@ func renderModule(module moduleInfo, services []protoreflect.ServiceDescriptor)
fmt.Fprintf(&out, "- 动态 HTTP`POST /rpc/%s/{Service}/{Method}`\n", module.Package) fmt.Fprintf(&out, "- 动态 HTTP`POST /rpc/%s/{Service}/{Method}`\n", module.Package)
fmt.Fprintf(&out, "- 原生 gRPC`/%s.{Service}/{Method}`\n", module.Package) fmt.Fprintf(&out, "- 原生 gRPC`/%s.{Service}/{Method}`\n", module.Package)
fmt.Fprintf(&out, "- grpc-gateway`POST /%s.{Service}/{Method}`\n", module.Package) fmt.Fprintf(&out, "- grpc-gateway`POST /%s.{Service}/{Method}`\n", module.Package)
out.WriteString("- 鉴权:需要登录的接口通过 `Authorization: Bearer <token>` 传递凭证。\n") out.WriteString("- 鉴权:需要登录的接口通过 `Authorization: <JWT>` 传递裸 JWT不添加 `Bearer` 前缀。\n")
out.WriteString("- 动态 HTTP 成功或失败均返回 HTTP 200业务状态见 `code`、`message`、`details`。\n\n") out.WriteString("- 动态 HTTP 成功或失败均返回 HTTP 200业务状态见 `code`、`message`、`details`。\n\n")
out.WriteString("## 服务概览\n\n") out.WriteString("## 服务概览\n\n")
@@ -122,7 +122,6 @@ func renderModule(module moduleInfo, services []protoreflect.ServiceDescriptor)
fmt.Fprintf(&out, "\n### %s.%s\n\n", service.Name(), method.Name()) fmt.Fprintf(&out, "\n### %s.%s\n\n", service.Name(), method.Name())
fmt.Fprintf(&out, "- 动态 HTTP`POST /rpc/%s/%s/%s`\n", module.Package, service.Name(), method.Name()) fmt.Fprintf(&out, "- 动态 HTTP`POST /rpc/%s/%s/%s`\n", module.Package, service.Name(), method.Name())
fmt.Fprintf(&out, "- gRPC`/%s/%s`\n", service.FullName(), method.Name()) fmt.Fprintf(&out, "- gRPC`/%s/%s`\n", service.FullName(), method.Name())
fmt.Fprintf(&out, "- 白名单键:`%s.%s`\n", service.FullName(), method.Name())
out.WriteString("- 请求示例:\n\n```json\n") out.WriteString("- 请求示例:\n\n```json\n")
out.Write(exampleJSON(method.Input())) out.Write(exampleJSON(method.Input()))
out.WriteString("\n```\n") out.WriteString("\n```\n")

View File

@@ -15,7 +15,7 @@
```http ```http
POST /rpc/passport/Login/Pwd POST /rpc/passport/Login/Pwd
Authorization: Bearer <token> Authorization: <JWT>
Content-Type: application/json Content-Type: application/json
{"account":"demo","password":"secret"} {"account":"demo","password":"secret"}
@@ -37,8 +37,8 @@ Content-Type: application/json
```json ```json
{ {
"code": 7, "code": 3,
"message": "dynamic RPC method is not allowed", "message": "invalid protobuf JSON: ...",
"details": [] "details": []
} }
``` ```
@@ -67,23 +67,10 @@ Content-Type: application/json
需要身份的接口统一发送: 需要身份的接口统一发送:
```http ```http
Authorization: Bearer <token> Authorization: <JWT>
``` ```
具体方法是否允许匿名由服务实现和 gRPC interceptor 决定。客户端不应仅根据请求字段推断匿名权限 请求头直接传递 JWT不添加 `Bearer` 前缀。`all` 使用 `Authorization.Key` 验证 HS256 签名,并根据 token 的 `exp``Authorization.Expire` 校验有效期;是否匿名由 `Authorization.Anonymous` 配置决定
## 动态 RPC 白名单
`all/etc/<workspace>_<runtime>.yaml``DynamicRPC.Allow` 控制可调用范围:
```yaml
DynamicRPC:
Allow:
- passport.Login.Pwd
- passport.Register
```
支持完整方法名、完整服务名或 `*`。生产环境不建议使用 `*`
## 当前限制与风险 ## 当前限制与风险

View File

@@ -9,7 +9,7 @@
- 动态 HTTP`POST /rpc/ads/{Service}/{Method}` - 动态 HTTP`POST /rpc/ads/{Service}/{Method}`
- 原生 gRPC`/ads.{Service}/{Method}` - 原生 gRPC`/ads.{Service}/{Method}`
- grpc-gateway`POST /ads.{Service}/{Method}` - grpc-gateway`POST /ads.{Service}/{Method}`
- 鉴权:需要登录的接口通过 `Authorization: Bearer <token>` 传递凭证 - 鉴权:需要登录的接口通过 `Authorization: <JWT>` 传递裸 JWT不添加 `Bearer` 前缀
- 动态 HTTP 成功或失败均返回 HTTP 200业务状态见 `code``message``details` - 动态 HTTP 成功或失败均返回 HTTP 200业务状态见 `code``message``details`
## 服务概览 ## 服务概览
@@ -28,7 +28,6 @@
- 动态 HTTP`POST /rpc/ads/Fetch/ByPos` - 动态 HTTP`POST /rpc/ads/Fetch/ByPos`
- gRPC`/ads.Fetch/ByPos` - gRPC`/ads.Fetch/ByPos`
- 白名单键:`ads.Fetch.ByPos`
- 请求示例: - 请求示例:
```json ```json

View File

@@ -9,7 +9,7 @@
- 动态 HTTP`POST /rpc/cloud/{Service}/{Method}` - 动态 HTTP`POST /rpc/cloud/{Service}/{Method}`
- 原生 gRPC`/cloud.{Service}/{Method}` - 原生 gRPC`/cloud.{Service}/{Method}`
- grpc-gateway`POST /cloud.{Service}/{Method}` - grpc-gateway`POST /cloud.{Service}/{Method}`
- 鉴权:需要登录的接口通过 `Authorization: Bearer <token>` 传递凭证 - 鉴权:需要登录的接口通过 `Authorization: <JWT>` 传递裸 JWT不添加 `Bearer` 前缀
- 动态 HTTP 成功或失败均返回 HTTP 200业务状态见 `code``message``details` - 动态 HTTP 成功或失败均返回 HTTP 200业务状态见 `code``message``details`
## 服务概览 ## 服务概览
@@ -45,7 +45,6 @@
- 动态 HTTP`POST /rpc/cloud/Album/CreateAlbum` - 动态 HTTP`POST /rpc/cloud/Album/CreateAlbum`
- gRPC`/cloud.Album/CreateAlbum` - gRPC`/cloud.Album/CreateAlbum`
- 白名单键:`cloud.Album.CreateAlbum`
- 请求示例: - 请求示例:
```json ```json
@@ -63,7 +62,6 @@
- 动态 HTTP`POST /rpc/cloud/Album/GetAlbum` - 动态 HTTP`POST /rpc/cloud/Album/GetAlbum`
- gRPC`/cloud.Album/GetAlbum` - gRPC`/cloud.Album/GetAlbum`
- 白名单键:`cloud.Album.GetAlbum`
- 请求示例: - 请求示例:
```json ```json
@@ -77,7 +75,6 @@
- 动态 HTTP`POST /rpc/cloud/Album/UpdateAlbum` - 动态 HTTP`POST /rpc/cloud/Album/UpdateAlbum`
- gRPC`/cloud.Album/UpdateAlbum` - gRPC`/cloud.Album/UpdateAlbum`
- 白名单键:`cloud.Album.UpdateAlbum`
- 请求示例: - 请求示例:
```json ```json
@@ -117,7 +114,6 @@
- 动态 HTTP`POST /rpc/cloud/Album/DeleteAlbum` - 动态 HTTP`POST /rpc/cloud/Album/DeleteAlbum`
- gRPC`/cloud.Album/DeleteAlbum` - gRPC`/cloud.Album/DeleteAlbum`
- 白名单键:`cloud.Album.DeleteAlbum`
- 请求示例: - 请求示例:
```json ```json
@@ -131,7 +127,6 @@
- 动态 HTTP`POST /rpc/cloud/Album/ListAlbums` - 动态 HTTP`POST /rpc/cloud/Album/ListAlbums`
- gRPC`/cloud.Album/ListAlbums` - gRPC`/cloud.Album/ListAlbums`
- 白名单键:`cloud.Album.ListAlbums`
- 请求示例: - 请求示例:
```json ```json
@@ -148,7 +143,6 @@
- 动态 HTTP`POST /rpc/cloud/Album/SetCoverPhoto` - 动态 HTTP`POST /rpc/cloud/Album/SetCoverPhoto`
- gRPC`/cloud.Album/SetCoverPhoto` - gRPC`/cloud.Album/SetCoverPhoto`
- 白名单键:`cloud.Album.SetCoverPhoto`
- 请求示例: - 请求示例:
```json ```json
@@ -162,7 +156,6 @@
- 动态 HTTP`POST /rpc/cloud/Album/UploadPhoto` - 动态 HTTP`POST /rpc/cloud/Album/UploadPhoto`
- gRPC`/cloud.Album/UploadPhoto` - gRPC`/cloud.Album/UploadPhoto`
- 白名单键:`cloud.Album.UploadPhoto`
- 请求示例: - 请求示例:
```json ```json
@@ -202,7 +195,6 @@
- 动态 HTTP`POST /rpc/cloud/Album/GetPhoto` - 动态 HTTP`POST /rpc/cloud/Album/GetPhoto`
- gRPC`/cloud.Album/GetPhoto` - gRPC`/cloud.Album/GetPhoto`
- 白名单键:`cloud.Album.GetPhoto`
- 请求示例: - 请求示例:
```json ```json
@@ -216,7 +208,6 @@
- 动态 HTTP`POST /rpc/cloud/Album/UpdatePhoto` - 动态 HTTP`POST /rpc/cloud/Album/UpdatePhoto`
- gRPC`/cloud.Album/UpdatePhoto` - gRPC`/cloud.Album/UpdatePhoto`
- 白名单键:`cloud.Album.UpdatePhoto`
- 请求示例: - 请求示例:
```json ```json
@@ -256,7 +247,6 @@
- 动态 HTTP`POST /rpc/cloud/Album/DeletePhoto` - 动态 HTTP`POST /rpc/cloud/Album/DeletePhoto`
- gRPC`/cloud.Album/DeletePhoto` - gRPC`/cloud.Album/DeletePhoto`
- 白名单键:`cloud.Album.DeletePhoto`
- 请求示例: - 请求示例:
```json ```json
@@ -270,7 +260,6 @@
- 动态 HTTP`POST /rpc/cloud/Album/ListPhotos` - 动态 HTTP`POST /rpc/cloud/Album/ListPhotos`
- gRPC`/cloud.Album/ListPhotos` - gRPC`/cloud.Album/ListPhotos`
- 白名单键:`cloud.Album.ListPhotos`
- 请求示例: - 请求示例:
```json ```json
@@ -287,7 +276,6 @@
- 动态 HTTP`POST /rpc/cloud/Album/MovePhoto` - 动态 HTTP`POST /rpc/cloud/Album/MovePhoto`
- gRPC`/cloud.Album/MovePhoto` - gRPC`/cloud.Album/MovePhoto`
- 白名单键:`cloud.Album.MovePhoto`
- 请求示例: - 请求示例:
```json ```json
@@ -312,7 +300,6 @@
- 动态 HTTP`POST /rpc/cloud/Bookmark/CreateBookmark` - 动态 HTTP`POST /rpc/cloud/Bookmark/CreateBookmark`
- gRPC`/cloud.Bookmark/CreateBookmark` - gRPC`/cloud.Bookmark/CreateBookmark`
- 白名单键:`cloud.Bookmark.CreateBookmark`
- 请求示例: - 请求示例:
```json ```json
@@ -333,7 +320,6 @@
- 动态 HTTP`POST /rpc/cloud/Bookmark/GetBookmark` - 动态 HTTP`POST /rpc/cloud/Bookmark/GetBookmark`
- gRPC`/cloud.Bookmark/GetBookmark` - gRPC`/cloud.Bookmark/GetBookmark`
- 白名单键:`cloud.Bookmark.GetBookmark`
- 请求示例: - 请求示例:
```json ```json
@@ -346,7 +332,6 @@
- 动态 HTTP`POST /rpc/cloud/Bookmark/UpdateBookmark` - 动态 HTTP`POST /rpc/cloud/Bookmark/UpdateBookmark`
- gRPC`/cloud.Bookmark/UpdateBookmark` - gRPC`/cloud.Bookmark/UpdateBookmark`
- 白名单键:`cloud.Bookmark.UpdateBookmark`
- 请求示例: - 请求示例:
```json ```json
@@ -369,7 +354,6 @@
- 动态 HTTP`POST /rpc/cloud/Bookmark/DeleteBookmark` - 动态 HTTP`POST /rpc/cloud/Bookmark/DeleteBookmark`
- gRPC`/cloud.Bookmark/DeleteBookmark` - gRPC`/cloud.Bookmark/DeleteBookmark`
- 白名单键:`cloud.Bookmark.DeleteBookmark`
- 请求示例: - 请求示例:
```json ```json
@@ -382,7 +366,6 @@
- 动态 HTTP`POST /rpc/cloud/Bookmark/ListBookmarks` - 动态 HTTP`POST /rpc/cloud/Bookmark/ListBookmarks`
- gRPC`/cloud.Bookmark/ListBookmarks` - gRPC`/cloud.Bookmark/ListBookmarks`
- 白名单键:`cloud.Bookmark.ListBookmarks`
- 请求示例: - 请求示例:
```json ```json
@@ -399,7 +382,6 @@
- 动态 HTTP`POST /rpc/cloud/Bookmark/ImportBookmarks` - 动态 HTTP`POST /rpc/cloud/Bookmark/ImportBookmarks`
- gRPC`/cloud.Bookmark/ImportBookmarks` - gRPC`/cloud.Bookmark/ImportBookmarks`
- 白名单键:`cloud.Bookmark.ImportBookmarks`
- 请求示例: - 请求示例:
```json ```json
@@ -433,7 +415,6 @@
- 动态 HTTP`POST /rpc/cloud/Disk/CreateDir` - 动态 HTTP`POST /rpc/cloud/Disk/CreateDir`
- gRPC`/cloud.Disk/CreateDir` - gRPC`/cloud.Disk/CreateDir`
- 白名单键:`cloud.Disk.CreateDir`
- 请求示例: - 请求示例:
```json ```json
@@ -450,7 +431,6 @@
- 动态 HTTP`POST /rpc/cloud/Disk/GetDir` - 动态 HTTP`POST /rpc/cloud/Disk/GetDir`
- gRPC`/cloud.Disk/GetDir` - gRPC`/cloud.Disk/GetDir`
- 白名单键:`cloud.Disk.GetDir`
- 请求示例: - 请求示例:
```json ```json
@@ -464,7 +444,6 @@
- 动态 HTTP`POST /rpc/cloud/Disk/UpdateDir` - 动态 HTTP`POST /rpc/cloud/Disk/UpdateDir`
- gRPC`/cloud.Disk/UpdateDir` - gRPC`/cloud.Disk/UpdateDir`
- 白名单键:`cloud.Disk.UpdateDir`
- 请求示例: - 请求示例:
```json ```json
@@ -503,7 +482,6 @@
- 动态 HTTP`POST /rpc/cloud/Disk/DeleteDir` - 动态 HTTP`POST /rpc/cloud/Disk/DeleteDir`
- gRPC`/cloud.Disk/DeleteDir` - gRPC`/cloud.Disk/DeleteDir`
- 白名单键:`cloud.Disk.DeleteDir`
- 请求示例: - 请求示例:
```json ```json
@@ -517,7 +495,6 @@
- 动态 HTTP`POST /rpc/cloud/Disk/ListDirs` - 动态 HTTP`POST /rpc/cloud/Disk/ListDirs`
- gRPC`/cloud.Disk/ListDirs` - gRPC`/cloud.Disk/ListDirs`
- 白名单键:`cloud.Disk.ListDirs`
- 请求示例: - 请求示例:
```json ```json
@@ -534,7 +511,6 @@
- 动态 HTTP`POST /rpc/cloud/Disk/GetDirTree` - 动态 HTTP`POST /rpc/cloud/Disk/GetDirTree`
- gRPC`/cloud.Disk/GetDirTree` - gRPC`/cloud.Disk/GetDirTree`
- 白名单键:`cloud.Disk.GetDirTree`
- 请求示例: - 请求示例:
```json ```json
@@ -548,7 +524,6 @@
- 动态 HTTP`POST /rpc/cloud/Disk/MoveDir` - 动态 HTTP`POST /rpc/cloud/Disk/MoveDir`
- gRPC`/cloud.Disk/MoveDir` - gRPC`/cloud.Disk/MoveDir`
- 白名单键:`cloud.Disk.MoveDir`
- 请求示例: - 请求示例:
```json ```json
@@ -562,7 +537,6 @@
- 动态 HTTP`POST /rpc/cloud/Disk/UploadFile` - 动态 HTTP`POST /rpc/cloud/Disk/UploadFile`
- gRPC`/cloud.Disk/UploadFile` - gRPC`/cloud.Disk/UploadFile`
- 白名单键:`cloud.Disk.UploadFile`
- 请求示例: - 请求示例:
```json ```json
@@ -583,7 +557,6 @@
- 动态 HTTP`POST /rpc/cloud/Disk/GetFile` - 动态 HTTP`POST /rpc/cloud/Disk/GetFile`
- gRPC`/cloud.Disk/GetFile` - gRPC`/cloud.Disk/GetFile`
- 白名单键:`cloud.Disk.GetFile`
- 请求示例: - 请求示例:
```json ```json
@@ -597,7 +570,6 @@
- 动态 HTTP`POST /rpc/cloud/Disk/UpdateFile` - 动态 HTTP`POST /rpc/cloud/Disk/UpdateFile`
- gRPC`/cloud.Disk/UpdateFile` - gRPC`/cloud.Disk/UpdateFile`
- 白名单键:`cloud.Disk.UpdateFile`
- 请求示例: - 请求示例:
```json ```json
@@ -636,7 +608,6 @@
- 动态 HTTP`POST /rpc/cloud/Disk/DeleteFile` - 动态 HTTP`POST /rpc/cloud/Disk/DeleteFile`
- gRPC`/cloud.Disk/DeleteFile` - gRPC`/cloud.Disk/DeleteFile`
- 白名单键:`cloud.Disk.DeleteFile`
- 请求示例: - 请求示例:
```json ```json
@@ -650,7 +621,6 @@
- 动态 HTTP`POST /rpc/cloud/Disk/ListFiles` - 动态 HTTP`POST /rpc/cloud/Disk/ListFiles`
- gRPC`/cloud.Disk/ListFiles` - gRPC`/cloud.Disk/ListFiles`
- 白名单键:`cloud.Disk.ListFiles`
- 请求示例: - 请求示例:
```json ```json
@@ -667,7 +637,6 @@
- 动态 HTTP`POST /rpc/cloud/Disk/MoveFile` - 动态 HTTP`POST /rpc/cloud/Disk/MoveFile`
- gRPC`/cloud.Disk/MoveFile` - gRPC`/cloud.Disk/MoveFile`
- 白名单键:`cloud.Disk.MoveFile`
- 请求示例: - 请求示例:
```json ```json
@@ -681,7 +650,6 @@
- 动态 HTTP`POST /rpc/cloud/Disk/CopyFile` - 动态 HTTP`POST /rpc/cloud/Disk/CopyFile`
- gRPC`/cloud.Disk/CopyFile` - gRPC`/cloud.Disk/CopyFile`
- 白名单键:`cloud.Disk.CopyFile`
- 请求示例: - 请求示例:
```json ```json
@@ -696,7 +664,6 @@
- 动态 HTTP`POST /rpc/cloud/Disk/SearchFiles` - 动态 HTTP`POST /rpc/cloud/Disk/SearchFiles`
- gRPC`/cloud.Disk/SearchFiles` - gRPC`/cloud.Disk/SearchFiles`
- 白名单键:`cloud.Disk.SearchFiles`
- 请求示例: - 请求示例:
```json ```json
@@ -728,7 +695,6 @@
- 动态 HTTP`POST /rpc/cloud/Note/CreateNote` - 动态 HTTP`POST /rpc/cloud/Note/CreateNote`
- gRPC`/cloud.Note/CreateNote` - gRPC`/cloud.Note/CreateNote`
- 白名单键:`cloud.Note.CreateNote`
- 请求示例: - 请求示例:
```json ```json
@@ -749,7 +715,6 @@
- 动态 HTTP`POST /rpc/cloud/Note/GetNote` - 动态 HTTP`POST /rpc/cloud/Note/GetNote`
- gRPC`/cloud.Note/GetNote` - gRPC`/cloud.Note/GetNote`
- 白名单键:`cloud.Note.GetNote`
- 请求示例: - 请求示例:
```json ```json
@@ -763,7 +728,6 @@
- 动态 HTTP`POST /rpc/cloud/Note/UpdateNote` - 动态 HTTP`POST /rpc/cloud/Note/UpdateNote`
- gRPC`/cloud.Note/UpdateNote` - gRPC`/cloud.Note/UpdateNote`
- 白名单键:`cloud.Note.UpdateNote`
- 请求示例: - 请求示例:
```json ```json
@@ -798,7 +762,6 @@
- 动态 HTTP`POST /rpc/cloud/Note/DeleteNote` - 动态 HTTP`POST /rpc/cloud/Note/DeleteNote`
- gRPC`/cloud.Note/DeleteNote` - gRPC`/cloud.Note/DeleteNote`
- 白名单键:`cloud.Note.DeleteNote`
- 请求示例: - 请求示例:
```json ```json
@@ -812,7 +775,6 @@
- 动态 HTTP`POST /rpc/cloud/Note/ListNotes` - 动态 HTTP`POST /rpc/cloud/Note/ListNotes`
- gRPC`/cloud.Note/ListNotes` - gRPC`/cloud.Note/ListNotes`
- 白名单键:`cloud.Note.ListNotes`
- 请求示例: - 请求示例:
```json ```json
@@ -829,7 +791,6 @@
- 动态 HTTP`POST /rpc/cloud/Note/TogglePin` - 动态 HTTP`POST /rpc/cloud/Note/TogglePin`
- gRPC`/cloud.Note/TogglePin` - gRPC`/cloud.Note/TogglePin`
- 白名单键:`cloud.Note.TogglePin`
- 请求示例: - 请求示例:
```json ```json
@@ -843,7 +804,6 @@
- 动态 HTTP`POST /rpc/cloud/Note/IncrementViews` - 动态 HTTP`POST /rpc/cloud/Note/IncrementViews`
- gRPC`/cloud.Note/IncrementViews` - gRPC`/cloud.Note/IncrementViews`
- 白名单键:`cloud.Note.IncrementViews`
- 请求示例: - 请求示例:
```json ```json
@@ -857,7 +817,6 @@
- 动态 HTTP`POST /rpc/cloud/Note/SearchNotes` - 动态 HTTP`POST /rpc/cloud/Note/SearchNotes`
- gRPC`/cloud.Note/SearchNotes` - gRPC`/cloud.Note/SearchNotes`
- 白名单键:`cloud.Note.SearchNotes`
- 请求示例: - 请求示例:
```json ```json
@@ -874,7 +833,6 @@
- 动态 HTTP`POST /rpc/cloud/Note/InsertAttachment` - 动态 HTTP`POST /rpc/cloud/Note/InsertAttachment`
- gRPC`/cloud.Note/InsertAttachment` - gRPC`/cloud.Note/InsertAttachment`
- 白名单键:`cloud.Note.InsertAttachment`
- 请求示例: - 请求示例:
```json ```json
@@ -893,7 +851,6 @@
- 动态 HTTP`POST /rpc/cloud/Note/DeleteAttachment` - 动态 HTTP`POST /rpc/cloud/Note/DeleteAttachment`
- gRPC`/cloud.Note/DeleteAttachment` - gRPC`/cloud.Note/DeleteAttachment`
- 白名单键:`cloud.Note.DeleteAttachment`
- 请求示例: - 请求示例:
```json ```json
@@ -921,7 +878,6 @@
- 动态 HTTP`POST /rpc/cloud/Private/CreatePrivateData` - 动态 HTTP`POST /rpc/cloud/Private/CreatePrivateData`
- gRPC`/cloud.Private/CreatePrivateData` - gRPC`/cloud.Private/CreatePrivateData`
- 白名单键:`cloud.Private.CreatePrivateData`
- 请求示例: - 请求示例:
```json ```json
@@ -941,7 +897,6 @@
- 动态 HTTP`POST /rpc/cloud/Private/GetPrivateData` - 动态 HTTP`POST /rpc/cloud/Private/GetPrivateData`
- gRPC`/cloud.Private/GetPrivateData` - gRPC`/cloud.Private/GetPrivateData`
- 白名单键:`cloud.Private.GetPrivateData`
- 请求示例: - 请求示例:
```json ```json
@@ -955,7 +910,6 @@
- 动态 HTTP`POST /rpc/cloud/Private/UpdatePrivateData` - 动态 HTTP`POST /rpc/cloud/Private/UpdatePrivateData`
- gRPC`/cloud.Private/UpdatePrivateData` - gRPC`/cloud.Private/UpdatePrivateData`
- 白名单键:`cloud.Private.UpdatePrivateData`
- 请求示例: - 请求示例:
```json ```json
@@ -977,7 +931,6 @@
- 动态 HTTP`POST /rpc/cloud/Private/DeletePrivateData` - 动态 HTTP`POST /rpc/cloud/Private/DeletePrivateData`
- gRPC`/cloud.Private/DeletePrivateData` - gRPC`/cloud.Private/DeletePrivateData`
- 白名单键:`cloud.Private.DeletePrivateData`
- 请求示例: - 请求示例:
```json ```json
@@ -991,7 +944,6 @@
- 动态 HTTP`POST /rpc/cloud/Private/ListPrivateData` - 动态 HTTP`POST /rpc/cloud/Private/ListPrivateData`
- gRPC`/cloud.Private/ListPrivateData` - gRPC`/cloud.Private/ListPrivateData`
- 白名单键:`cloud.Private.ListPrivateData`
- 请求示例: - 请求示例:
```json ```json
@@ -1008,7 +960,6 @@
- 动态 HTTP`POST /rpc/cloud/Private/GetPrivateDataByType` - 动态 HTTP`POST /rpc/cloud/Private/GetPrivateDataByType`
- gRPC`/cloud.Private/GetPrivateDataByType` - gRPC`/cloud.Private/GetPrivateDataByType`
- 白名单键:`cloud.Private.GetPrivateDataByType`
- 请求示例: - 请求示例:
```json ```json
@@ -1025,7 +976,6 @@
- 动态 HTTP`POST /rpc/cloud/Private/SearchPrivateData` - 动态 HTTP`POST /rpc/cloud/Private/SearchPrivateData`
- gRPC`/cloud.Private/SearchPrivateData` - gRPC`/cloud.Private/SearchPrivateData`
- 白名单键:`cloud.Private.SearchPrivateData`
- 请求示例: - 请求示例:
```json ```json
@@ -1042,7 +992,6 @@
- 动态 HTTP`POST /rpc/cloud/Private/EncryptData` - 动态 HTTP`POST /rpc/cloud/Private/EncryptData`
- gRPC`/cloud.Private/EncryptData` - gRPC`/cloud.Private/EncryptData`
- 白名单键:`cloud.Private.EncryptData`
- 请求示例: - 请求示例:
```json ```json
@@ -1056,7 +1005,6 @@
- 动态 HTTP`POST /rpc/cloud/Private/DecryptData` - 动态 HTTP`POST /rpc/cloud/Private/DecryptData`
- gRPC`/cloud.Private/DecryptData` - gRPC`/cloud.Private/DecryptData`
- 白名单键:`cloud.Private.DecryptData`
- 请求示例: - 请求示例:
```json ```json
@@ -1080,7 +1028,6 @@
- 动态 HTTP`POST /rpc/cloud/Share/CreateShare` - 动态 HTTP`POST /rpc/cloud/Share/CreateShare`
- gRPC`/cloud.Share/CreateShare` - gRPC`/cloud.Share/CreateShare`
- 白名单键:`cloud.Share.CreateShare`
- 请求示例: - 请求示例:
```json ```json
@@ -1100,7 +1047,6 @@
- 动态 HTTP`POST /rpc/cloud/Share/GetShare` - 动态 HTTP`POST /rpc/cloud/Share/GetShare`
- gRPC`/cloud.Share/GetShare` - gRPC`/cloud.Share/GetShare`
- 白名单键:`cloud.Share.GetShare`
- 请求示例: - 请求示例:
```json ```json
@@ -1114,7 +1060,6 @@
- 动态 HTTP`POST /rpc/cloud/Share/DeleteShare` - 动态 HTTP`POST /rpc/cloud/Share/DeleteShare`
- gRPC`/cloud.Share/DeleteShare` - gRPC`/cloud.Share/DeleteShare`
- 白名单键:`cloud.Share.DeleteShare`
- 请求示例: - 请求示例:
```json ```json
@@ -1128,7 +1073,6 @@
- 动态 HTTP`POST /rpc/cloud/Share/ListShares` - 动态 HTTP`POST /rpc/cloud/Share/ListShares`
- gRPC`/cloud.Share/ListShares` - gRPC`/cloud.Share/ListShares`
- 白名单键:`cloud.Share.ListShares`
- 请求示例: - 请求示例:
```json ```json
@@ -1145,7 +1089,6 @@
- 动态 HTTP`POST /rpc/cloud/Share/ValidateSharePassword` - 动态 HTTP`POST /rpc/cloud/Share/ValidateSharePassword`
- gRPC`/cloud.Share/ValidateSharePassword` - gRPC`/cloud.Share/ValidateSharePassword`
- 白名单键:`cloud.Share.ValidateSharePassword`
- 请求示例: - 请求示例:
```json ```json
@@ -1166,7 +1109,6 @@
- 动态 HTTP`POST /rpc/cloud/Space/Get` - 动态 HTTP`POST /rpc/cloud/Space/Get`
- gRPC`/cloud.Space/Get` - gRPC`/cloud.Space/Get`
- 白名单键:`cloud.Space.Get`
- 请求示例: - 请求示例:
```json ```json
@@ -1177,7 +1119,6 @@
- 动态 HTTP`POST /rpc/cloud/Space/GetByKeyIdentifier` - 动态 HTTP`POST /rpc/cloud/Space/GetByKeyIdentifier`
- gRPC`/cloud.Space/GetByKeyIdentifier` - gRPC`/cloud.Space/GetByKeyIdentifier`
- 白名单键:`cloud.Space.GetByKeyIdentifier`
- 请求示例: - 请求示例:
```json ```json

View File

@@ -9,7 +9,7 @@
- 动态 HTTP`POST /rpc/cms/{Service}/{Method}` - 动态 HTTP`POST /rpc/cms/{Service}/{Method}`
- 原生 gRPC`/cms.{Service}/{Method}` - 原生 gRPC`/cms.{Service}/{Method}`
- grpc-gateway`POST /cms.{Service}/{Method}` - grpc-gateway`POST /cms.{Service}/{Method}`
- 鉴权:需要登录的接口通过 `Authorization: Bearer <token>` 传递凭证 - 鉴权:需要登录的接口通过 `Authorization: <JWT>` 传递裸 JWT不添加 `Bearer` 前缀
- 动态 HTTP 成功或失败均返回 HTTP 200业务状态见 `code``message``details` - 动态 HTTP 成功或失败均返回 HTTP 200业务状态见 `code``message``details`
## 服务概览 ## 服务概览
@@ -35,7 +35,6 @@
- 动态 HTTP`POST /rpc/cms/Category/Fetch` - 动态 HTTP`POST /rpc/cms/Category/Fetch`
- gRPC`/cms.Category/Fetch` - gRPC`/cms.Category/Fetch`
- 白名单键:`cms.Category.Fetch`
- 请求示例: - 请求示例:
```json ```json
@@ -49,7 +48,6 @@
- 动态 HTTP`POST /rpc/cms/Category/Create` - 动态 HTTP`POST /rpc/cms/Category/Create`
- gRPC`/cms.Category/Create` - gRPC`/cms.Category/Create`
- 白名单键:`cms.Category.Create`
- 请求示例: - 请求示例:
```json ```json
@@ -74,7 +72,6 @@
- 动态 HTTP`POST /rpc/cms/Category/Modify` - 动态 HTTP`POST /rpc/cms/Category/Modify`
- gRPC`/cms.Category/Modify` - gRPC`/cms.Category/Modify`
- 白名单键:`cms.Category.Modify`
- 请求示例: - 请求示例:
```json ```json
@@ -112,7 +109,6 @@
- 动态 HTTP`POST /rpc/cms/Category/Delete` - 动态 HTTP`POST /rpc/cms/Category/Delete`
- gRPC`/cms.Category/Delete` - gRPC`/cms.Category/Delete`
- 白名单键:`cms.Category.Delete`
- 请求示例: - 请求示例:
```json ```json
@@ -136,7 +132,6 @@
- 动态 HTTP`POST /rpc/cms/Pages/Fetch` - 动态 HTTP`POST /rpc/cms/Pages/Fetch`
- gRPC`/cms.Pages/Fetch` - gRPC`/cms.Pages/Fetch`
- 白名单键:`cms.Pages.Fetch`
- 请求示例: - 请求示例:
```json ```json
@@ -152,7 +147,6 @@
- 动态 HTTP`POST /rpc/cms/Pages/GetByIdentity` - 动态 HTTP`POST /rpc/cms/Pages/GetByIdentity`
- gRPC`/cms.Pages/GetByIdentity` - gRPC`/cms.Pages/GetByIdentity`
- 白名单键:`cms.Pages.GetByIdentity`
- 请求示例: - 请求示例:
```json ```json
@@ -165,7 +159,6 @@
- 动态 HTTP`POST /rpc/cms/Pages/GetByKey` - 动态 HTTP`POST /rpc/cms/Pages/GetByKey`
- gRPC`/cms.Pages/GetByKey` - gRPC`/cms.Pages/GetByKey`
- 白名单键:`cms.Pages.GetByKey`
- 请求示例: - 请求示例:
```json ```json
@@ -178,7 +171,6 @@
- 动态 HTTP`POST /rpc/cms/Pages/Create` - 动态 HTTP`POST /rpc/cms/Pages/Create`
- gRPC`/cms.Pages/Create` - gRPC`/cms.Pages/Create`
- 白名单键:`cms.Pages.Create`
- 请求示例: - 请求示例:
```json ```json
@@ -227,7 +219,6 @@
- 动态 HTTP`POST /rpc/cms/Pages/Modify` - 动态 HTTP`POST /rpc/cms/Pages/Modify`
- gRPC`/cms.Pages/Modify` - gRPC`/cms.Pages/Modify`
- 白名单键:`cms.Pages.Modify`
- 请求示例: - 请求示例:
```json ```json
@@ -276,7 +267,6 @@
- 动态 HTTP`POST /rpc/cms/Pages/Delete` - 动态 HTTP`POST /rpc/cms/Pages/Delete`
- gRPC`/cms.Pages/Delete` - gRPC`/cms.Pages/Delete`
- 白名单键:`cms.Pages.Delete`
- 请求示例: - 请求示例:
```json ```json
@@ -314,7 +304,6 @@
- 动态 HTTP`POST /rpc/cms/Post/Fetch` - 动态 HTTP`POST /rpc/cms/Post/Fetch`
- gRPC`/cms.Post/Fetch` - gRPC`/cms.Post/Fetch`
- 白名单键:`cms.Post.Fetch`
- 请求示例: - 请求示例:
```json ```json
@@ -332,7 +321,6 @@
- 动态 HTTP`POST /rpc/cms/Post/GetByIdentity` - 动态 HTTP`POST /rpc/cms/Post/GetByIdentity`
- gRPC`/cms.Post/GetByIdentity` - gRPC`/cms.Post/GetByIdentity`
- 白名单键:`cms.Post.GetByIdentity`
- 请求示例: - 请求示例:
```json ```json
@@ -346,7 +334,6 @@
- 动态 HTTP`POST /rpc/cms/Post/GetByKey` - 动态 HTTP`POST /rpc/cms/Post/GetByKey`
- gRPC`/cms.Post/GetByKey` - gRPC`/cms.Post/GetByKey`
- 白名单键:`cms.Post.GetByKey`
- 请求示例: - 请求示例:
```json ```json
@@ -359,7 +346,6 @@
- 动态 HTTP`POST /rpc/cms/Post/Search` - 动态 HTTP`POST /rpc/cms/Post/Search`
- gRPC`/cms.Post/Search` - gRPC`/cms.Post/Search`
- 白名单键:`cms.Post.Search`
- 请求示例: - 请求示例:
```json ```json
@@ -374,7 +360,6 @@
- 动态 HTTP`POST /rpc/cms/Post/Create` - 动态 HTTP`POST /rpc/cms/Post/Create`
- gRPC`/cms.Post/Create` - gRPC`/cms.Post/Create`
- 白名单键:`cms.Post.Create`
- 请求示例: - 请求示例:
```json ```json
@@ -460,7 +445,6 @@
- 动态 HTTP`POST /rpc/cms/Post/Modify` - 动态 HTTP`POST /rpc/cms/Post/Modify`
- gRPC`/cms.Post/Modify` - gRPC`/cms.Post/Modify`
- 白名单键:`cms.Post.Modify`
- 请求示例: - 请求示例:
```json ```json
@@ -546,7 +530,6 @@
- 动态 HTTP`POST /rpc/cms/Post/Delete` - 动态 HTTP`POST /rpc/cms/Post/Delete`
- gRPC`/cms.Post/Delete` - gRPC`/cms.Post/Delete`
- 白名单键:`cms.Post.Delete`
- 请求示例: - 请求示例:
```json ```json
@@ -560,7 +543,6 @@
- 动态 HTTP`POST /rpc/cms/Post/IncrPostLike` - 动态 HTTP`POST /rpc/cms/Post/IncrPostLike`
- gRPC`/cms.Post/IncrPostLike` - gRPC`/cms.Post/IncrPostLike`
- 白名单键:`cms.Post.IncrPostLike`
- 请求示例: - 请求示例:
```json ```json
@@ -574,7 +556,6 @@
- 动态 HTTP`POST /rpc/cms/Post/DescPostLike` - 动态 HTTP`POST /rpc/cms/Post/DescPostLike`
- gRPC`/cms.Post/DescPostLike` - gRPC`/cms.Post/DescPostLike`
- 白名单键:`cms.Post.DescPostLike`
- 请求示例: - 请求示例:
```json ```json
@@ -588,7 +569,6 @@
- 动态 HTTP`POST /rpc/cms/Post/IncrPostUnlike` - 动态 HTTP`POST /rpc/cms/Post/IncrPostUnlike`
- gRPC`/cms.Post/IncrPostUnlike` - gRPC`/cms.Post/IncrPostUnlike`
- 白名单键:`cms.Post.IncrPostUnlike`
- 请求示例: - 请求示例:
```json ```json
@@ -602,7 +582,6 @@
- 动态 HTTP`POST /rpc/cms/Post/DescPostUnlike` - 动态 HTTP`POST /rpc/cms/Post/DescPostUnlike`
- gRPC`/cms.Post/DescPostUnlike` - gRPC`/cms.Post/DescPostUnlike`
- 白名单键:`cms.Post.DescPostUnlike`
- 请求示例: - 请求示例:
```json ```json
@@ -616,7 +595,6 @@
- 动态 HTTP`POST /rpc/cms/Post/CommentList` - 动态 HTTP`POST /rpc/cms/Post/CommentList`
- gRPC`/cms.Post/CommentList` - gRPC`/cms.Post/CommentList`
- 白名单键:`cms.Post.CommentList`
- 请求示例: - 请求示例:
```json ```json
@@ -631,7 +609,6 @@
- 动态 HTTP`POST /rpc/cms/Post/AddComment` - 动态 HTTP`POST /rpc/cms/Post/AddComment`
- gRPC`/cms.Post/AddComment` - gRPC`/cms.Post/AddComment`
- 白名单键:`cms.Post.AddComment`
- 请求示例: - 请求示例:
```json ```json
@@ -659,7 +636,6 @@
- 动态 HTTP`POST /rpc/cms/Post/ModifyComment` - 动态 HTTP`POST /rpc/cms/Post/ModifyComment`
- gRPC`/cms.Post/ModifyComment` - gRPC`/cms.Post/ModifyComment`
- 白名单键:`cms.Post.ModifyComment`
- 请求示例: - 请求示例:
```json ```json
@@ -687,7 +663,6 @@
- 动态 HTTP`POST /rpc/cms/Post/DeleteComment` - 动态 HTTP`POST /rpc/cms/Post/DeleteComment`
- gRPC`/cms.Post/DeleteComment` - gRPC`/cms.Post/DeleteComment`
- 白名单键:`cms.Post.DeleteComment`
- 请求示例: - 请求示例:
```json ```json
@@ -701,7 +676,6 @@
- 动态 HTTP`POST /rpc/cms/Post/IncrCommentLike` - 动态 HTTP`POST /rpc/cms/Post/IncrCommentLike`
- gRPC`/cms.Post/IncrCommentLike` - gRPC`/cms.Post/IncrCommentLike`
- 白名单键:`cms.Post.IncrCommentLike`
- 请求示例: - 请求示例:
```json ```json
@@ -715,7 +689,6 @@
- 动态 HTTP`POST /rpc/cms/Post/DescCommentLike` - 动态 HTTP`POST /rpc/cms/Post/DescCommentLike`
- gRPC`/cms.Post/DescCommentLike` - gRPC`/cms.Post/DescCommentLike`
- 白名单键:`cms.Post.DescCommentLike`
- 请求示例: - 请求示例:
```json ```json
@@ -729,7 +702,6 @@
- 动态 HTTP`POST /rpc/cms/Post/IncrCommentUnlike` - 动态 HTTP`POST /rpc/cms/Post/IncrCommentUnlike`
- gRPC`/cms.Post/IncrCommentUnlike` - gRPC`/cms.Post/IncrCommentUnlike`
- 白名单键:`cms.Post.IncrCommentUnlike`
- 请求示例: - 请求示例:
```json ```json
@@ -743,7 +715,6 @@
- 动态 HTTP`POST /rpc/cms/Post/DescCommentUnlike` - 动态 HTTP`POST /rpc/cms/Post/DescCommentUnlike`
- gRPC`/cms.Post/DescCommentUnlike` - gRPC`/cms.Post/DescCommentUnlike`
- 白名单键:`cms.Post.DescCommentUnlike`
- 请求示例: - 请求示例:
```json ```json
@@ -767,7 +738,6 @@
- 动态 HTTP`POST /rpc/cms/Site/Fetch` - 动态 HTTP`POST /rpc/cms/Site/Fetch`
- gRPC`/cms.Site/Fetch` - gRPC`/cms.Site/Fetch`
- 白名单键:`cms.Site.Fetch`
- 请求示例: - 请求示例:
```json ```json
@@ -778,7 +748,6 @@
- 动态 HTTP`POST /rpc/cms/Site/Get` - 动态 HTTP`POST /rpc/cms/Site/Get`
- gRPC`/cms.Site/Get` - gRPC`/cms.Site/Get`
- 白名单键:`cms.Site.Get`
- 请求示例: - 请求示例:
```json ```json
@@ -792,7 +761,6 @@
- 动态 HTTP`POST /rpc/cms/Site/Create` - 动态 HTTP`POST /rpc/cms/Site/Create`
- gRPC`/cms.Site/Create` - gRPC`/cms.Site/Create`
- 白名单键:`cms.Site.Create`
- 请求示例: - 请求示例:
```json ```json
@@ -814,7 +782,6 @@
- 动态 HTTP`POST /rpc/cms/Site/Modify` - 动态 HTTP`POST /rpc/cms/Site/Modify`
- gRPC`/cms.Site/Modify` - gRPC`/cms.Site/Modify`
- 白名单键:`cms.Site.Modify`
- 请求示例: - 请求示例:
```json ```json
@@ -836,7 +803,6 @@
- 动态 HTTP`POST /rpc/cms/Site/Delete` - 动态 HTTP`POST /rpc/cms/Site/Delete`
- gRPC`/cms.Site/Delete` - gRPC`/cms.Site/Delete`
- 白名单键:`cms.Site.Delete`
- 请求示例: - 请求示例:
```json ```json
@@ -859,7 +825,6 @@
- 动态 HTTP`POST /rpc/cms/Tags/Fetch` - 动态 HTTP`POST /rpc/cms/Tags/Fetch`
- gRPC`/cms.Tags/Fetch` - gRPC`/cms.Tags/Fetch`
- 白名单键:`cms.Tags.Fetch`
- 请求示例: - 请求示例:
```json ```json
@@ -873,7 +838,6 @@
- 动态 HTTP`POST /rpc/cms/Tags/Create` - 动态 HTTP`POST /rpc/cms/Tags/Create`
- gRPC`/cms.Tags/Create` - gRPC`/cms.Tags/Create`
- 白名单键:`cms.Tags.Create`
- 请求示例: - 请求示例:
```json ```json
@@ -891,7 +855,6 @@
- 动态 HTTP`POST /rpc/cms/Tags/Modify` - 动态 HTTP`POST /rpc/cms/Tags/Modify`
- gRPC`/cms.Tags/Modify` - gRPC`/cms.Tags/Modify`
- 白名单键:`cms.Tags.Modify`
- 请求示例: - 请求示例:
```json ```json
@@ -909,7 +872,6 @@
- 动态 HTTP`POST /rpc/cms/Tags/Delete` - 动态 HTTP`POST /rpc/cms/Tags/Delete`
- gRPC`/cms.Tags/Delete` - gRPC`/cms.Tags/Delete`
- 白名单键:`cms.Tags.Delete`
- 请求示例: - 请求示例:
```json ```json

View File

@@ -9,7 +9,7 @@
- 动态 HTTP`POST /rpc/feedback/{Service}/{Method}` - 动态 HTTP`POST /rpc/feedback/{Service}/{Method}`
- 原生 gRPC`/feedback.{Service}/{Method}` - 原生 gRPC`/feedback.{Service}/{Method}`
- grpc-gateway`POST /feedback.{Service}/{Method}` - grpc-gateway`POST /feedback.{Service}/{Method}`
- 鉴权:需要登录的接口通过 `Authorization: Bearer <token>` 传递凭证 - 鉴权:需要登录的接口通过 `Authorization: <JWT>` 传递裸 JWT不添加 `Bearer` 前缀
- 动态 HTTP 成功或失败均返回 HTTP 200业务状态见 `code``message``details` - 动态 HTTP 成功或失败均返回 HTTP 200业务状态见 `code``message``details`
## 服务概览 ## 服务概览
@@ -33,7 +33,6 @@
- 动态 HTTP`POST /rpc/feedback/Method/List` - 动态 HTTP`POST /rpc/feedback/Method/List`
- gRPC`/feedback.Method/List` - gRPC`/feedback.Method/List`
- 白名单键:`feedback.Method.List`
- 请求示例: - 请求示例:
```json ```json
@@ -55,7 +54,6 @@
- 动态 HTTP`POST /rpc/feedback/Method/Get` - 动态 HTTP`POST /rpc/feedback/Method/Get`
- gRPC`/feedback.Method/Get` - gRPC`/feedback.Method/Get`
- 白名单键:`feedback.Method.Get`
- 请求示例: - 请求示例:
```json ```json
@@ -68,7 +66,6 @@
- 动态 HTTP`POST /rpc/feedback/Method/Add` - 动态 HTTP`POST /rpc/feedback/Method/Add`
- gRPC`/feedback.Method/Add` - gRPC`/feedback.Method/Add`
- 白名单键:`feedback.Method.Add`
- 请求示例: - 请求示例:
```json ```json
@@ -105,7 +102,6 @@
- 动态 HTTP`POST /rpc/feedback/Method/Modify` - 动态 HTTP`POST /rpc/feedback/Method/Modify`
- gRPC`/feedback.Method/Modify` - gRPC`/feedback.Method/Modify`
- 白名单键:`feedback.Method.Modify`
- 请求示例: - 请求示例:
```json ```json
@@ -143,7 +139,6 @@
- 动态 HTTP`POST /rpc/feedback/Method/Delete` - 动态 HTTP`POST /rpc/feedback/Method/Delete`
- gRPC`/feedback.Method/Delete` - gRPC`/feedback.Method/Delete`
- 白名单键:`feedback.Method.Delete`
- 请求示例: - 请求示例:
```json ```json
@@ -156,7 +151,6 @@
- 动态 HTTP`POST /rpc/feedback/Method/Remark` - 动态 HTTP`POST /rpc/feedback/Method/Remark`
- gRPC`/feedback.Method/Remark` - gRPC`/feedback.Method/Remark`
- 白名单键:`feedback.Method.Remark`
- 请求示例: - 请求示例:
```json ```json

View File

@@ -9,7 +9,7 @@
- 动态 HTTP`POST /rpc/initial/{Service}/{Method}` - 动态 HTTP`POST /rpc/initial/{Service}/{Method}`
- 原生 gRPC`/initial.{Service}/{Method}` - 原生 gRPC`/initial.{Service}/{Method}`
- grpc-gateway`POST /initial.{Service}/{Method}` - grpc-gateway`POST /initial.{Service}/{Method}`
- 鉴权:需要登录的接口通过 `Authorization: Bearer <token>` 传递凭证 - 鉴权:需要登录的接口通过 `Authorization: <JWT>` 传递裸 JWT不添加 `Bearer` 前缀
- 动态 HTTP 成功或失败均返回 HTTP 200业务状态见 `code``message``details` - 动态 HTTP 成功或失败均返回 HTTP 200业务状态见 `code``message``details`
## 服务概览 ## 服务概览
@@ -31,7 +31,6 @@
- 动态 HTTP`POST /rpc/initial/Check/Hello` - 动态 HTTP`POST /rpc/initial/Check/Hello`
- gRPC`/initial.Check/Hello` - gRPC`/initial.Check/Hello`
- 白名单键:`initial.Check.Hello`
- 请求示例: - 请求示例:
```json ```json
@@ -44,7 +43,6 @@
- 动态 HTTP`POST /rpc/initial/Check/Config` - 动态 HTTP`POST /rpc/initial/Check/Config`
- gRPC`/initial.Check/Config` - gRPC`/initial.Check/Config`
- 白名单键:`initial.Check.Config`
- 请求示例: - 请求示例:
```json ```json
@@ -58,7 +56,6 @@
- 动态 HTTP`POST /rpc/initial/Check/Updates` - 动态 HTTP`POST /rpc/initial/Check/Updates`
- gRPC`/initial.Check/Updates` - gRPC`/initial.Check/Updates`
- 白名单键:`initial.Check.Updates`
- 请求示例: - 请求示例:
```json ```json
@@ -82,7 +79,6 @@
- 动态 HTTP`POST /rpc/initial/Data/Country` - 动态 HTTP`POST /rpc/initial/Data/Country`
- gRPC`/initial.Data/Country` - gRPC`/initial.Data/Country`
- 白名单键:`initial.Data.Country`
- 请求示例: - 请求示例:
```json ```json
@@ -93,7 +89,6 @@
- 动态 HTTP`POST /rpc/initial/Data/Areas` - 动态 HTTP`POST /rpc/initial/Data/Areas`
- gRPC`/initial.Data/Areas` - gRPC`/initial.Data/Areas`
- 白名单键:`initial.Data.Areas`
- 请求示例: - 请求示例:
```json ```json
@@ -108,7 +103,6 @@
- 动态 HTTP`POST /rpc/initial/Data/Datas` - 动态 HTTP`POST /rpc/initial/Data/Datas`
- gRPC`/initial.Data/Datas` - gRPC`/initial.Data/Datas`
- 白名单键:`initial.Data.Datas`
- 请求示例: - 请求示例:
```json ```json

View File

@@ -9,7 +9,7 @@
- 动态 HTTP`POST /rpc/passport/{Service}/{Method}` - 动态 HTTP`POST /rpc/passport/{Service}/{Method}`
- 原生 gRPC`/passport.{Service}/{Method}` - 原生 gRPC`/passport.{Service}/{Method}`
- grpc-gateway`POST /passport.{Service}/{Method}` - grpc-gateway`POST /passport.{Service}/{Method}`
- 鉴权:需要登录的接口通过 `Authorization: Bearer <token>` 传递凭证 - 鉴权:需要登录的接口通过 `Authorization: <JWT>` 传递裸 JWT不添加 `Bearer` 前缀
- 动态 HTTP 成功或失败均返回 HTTP 200业务状态见 `code``message``details` - 动态 HTTP 成功或失败均返回 HTTP 200业务状态见 `code``message``details`
## 服务概览 ## 服务概览
@@ -37,7 +37,6 @@
- 动态 HTTP`POST /rpc/passport/Account/Get` - 动态 HTTP`POST /rpc/passport/Account/Get`
- gRPC`/passport.Account/Get` - gRPC`/passport.Account/Get`
- 白名单键:`passport.Account.Get`
- 请求示例: - 请求示例:
```json ```json
@@ -48,7 +47,6 @@
- 动态 HTTP`POST /rpc/passport/Account/SetData` - 动态 HTTP`POST /rpc/passport/Account/SetData`
- gRPC`/passport.Account/SetData` - gRPC`/passport.Account/SetData`
- 白名单键:`passport.Account.SetData`
- 请求示例: - 请求示例:
```json ```json
@@ -72,7 +70,6 @@
- 动态 HTTP`POST /rpc/passport/Account/SetPassword` - 动态 HTTP`POST /rpc/passport/Account/SetPassword`
- gRPC`/passport.Account/SetPassword` - gRPC`/passport.Account/SetPassword`
- 白名单键:`passport.Account.SetPassword`
- 请求示例: - 请求示例:
```json ```json
@@ -86,7 +83,6 @@
- 动态 HTTP`POST /rpc/passport/Account/TagCreate` - 动态 HTTP`POST /rpc/passport/Account/TagCreate`
- gRPC`/passport.Account/TagCreate` - gRPC`/passport.Account/TagCreate`
- 白名单键:`passport.Account.TagCreate`
- 请求示例: - 请求示例:
```json ```json
@@ -100,7 +96,6 @@
- 动态 HTTP`POST /rpc/passport/Account/TagRemove` - 动态 HTTP`POST /rpc/passport/Account/TagRemove`
- gRPC`/passport.Account/TagRemove` - gRPC`/passport.Account/TagRemove`
- 白名单键:`passport.Account.TagRemove`
- 请求示例: - 请求示例:
```json ```json
@@ -114,7 +109,6 @@
- 动态 HTTP`POST /rpc/passport/Account/Statistics` - 动态 HTTP`POST /rpc/passport/Account/Statistics`
- gRPC`/passport.Account/Statistics` - gRPC`/passport.Account/Statistics`
- 白名单键:`passport.Account.Statistics`
- 请求示例: - 请求示例:
```json ```json
@@ -136,7 +130,6 @@
- 动态 HTTP`POST /rpc/passport/Forget/Verify` - 动态 HTTP`POST /rpc/passport/Forget/Verify`
- gRPC`/passport.Forget/Verify` - gRPC`/passport.Forget/Verify`
- 白名单键:`passport.Forget.Verify`
- 请求示例: - 请求示例:
```json ```json
@@ -150,7 +143,6 @@
- 动态 HTTP`POST /rpc/passport/Forget/Reset` - 动态 HTTP`POST /rpc/passport/Forget/Reset`
- gRPC`/passport.Forget/Reset` - gRPC`/passport.Forget/Reset`
- 白名单键:`passport.Forget.Reset`
- 请求示例: - 请求示例:
```json ```json
@@ -172,7 +164,6 @@
- 动态 HTTP`POST /rpc/passport/Login/Pwd` - 动态 HTTP`POST /rpc/passport/Login/Pwd`
- gRPC`/passport.Login/Pwd` - gRPC`/passport.Login/Pwd`
- 白名单键:`passport.Login.Pwd`
- 请求示例: - 请求示例:
```json ```json
@@ -186,7 +177,6 @@
- 动态 HTTP`POST /rpc/passport/Login/Code` - 动态 HTTP`POST /rpc/passport/Login/Code`
- gRPC`/passport.Login/Code` - gRPC`/passport.Login/Code`
- 白名单键:`passport.Login.Code`
- 请求示例: - 请求示例:
```json ```json
@@ -205,7 +195,6 @@
- 动态 HTTP`POST /rpc/passport/Login/Quick` - 动态 HTTP`POST /rpc/passport/Login/Quick`
- gRPC`/passport.Login/Quick` - gRPC`/passport.Login/Quick`
- 白名单键:`passport.Login.Quick`
- 请求示例: - 请求示例:
```json ```json
@@ -231,7 +220,6 @@
- 动态 HTTP`POST /rpc/passport/Register/Pwd` - 动态 HTTP`POST /rpc/passport/Register/Pwd`
- gRPC`/passport.Register/Pwd` - gRPC`/passport.Register/Pwd`
- 白名单键:`passport.Register.Pwd`
- 请求示例: - 请求示例:
```json ```json
@@ -253,7 +241,6 @@
- 动态 HTTP`POST /rpc/passport/Register/Code` - 动态 HTTP`POST /rpc/passport/Register/Code`
- gRPC`/passport.Register/Code` - gRPC`/passport.Register/Code`
- 白名单键:`passport.Register.Code`
- 请求示例: - 请求示例:
```json ```json
@@ -282,7 +269,6 @@
- 动态 HTTP`POST /rpc/passport/Verify/Request` - 动态 HTTP`POST /rpc/passport/Verify/Request`
- gRPC`/passport.Verify/Request` - gRPC`/passport.Verify/Request`
- 白名单键:`passport.Verify.Request`
- 请求示例: - 请求示例:
```json ```json
@@ -298,7 +284,6 @@
- 动态 HTTP`POST /rpc/passport/Verify/JumioCallback` - 动态 HTTP`POST /rpc/passport/Verify/JumioCallback`
- gRPC`/passport.Verify/JumioCallback` - gRPC`/passport.Verify/JumioCallback`
- 白名单键:`passport.Verify.JumioCallback`
- 请求示例: - 请求示例:
```json ```json

View File

@@ -9,7 +9,7 @@
- 动态 HTTP`POST /rpc/sender/{Service}/{Method}` - 动态 HTTP`POST /rpc/sender/{Service}/{Method}`
- 原生 gRPC`/sender.{Service}/{Method}` - 原生 gRPC`/sender.{Service}/{Method}`
- grpc-gateway`POST /sender.{Service}/{Method}` - grpc-gateway`POST /sender.{Service}/{Method}`
- 鉴权:需要登录的接口通过 `Authorization: Bearer <token>` 传递凭证 - 鉴权:需要登录的接口通过 `Authorization: <JWT>` 传递裸 JWT不添加 `Bearer` 前缀
- 动态 HTTP 成功或失败均返回 HTTP 200业务状态见 `code``message``details` - 动态 HTTP 成功或失败均返回 HTTP 200业务状态见 `code``message``details`
## 服务概览 ## 服务概览
@@ -29,7 +29,6 @@
- 动态 HTTP`POST /rpc/sender/Mail/Send` - 动态 HTTP`POST /rpc/sender/Mail/Send`
- gRPC`/sender.Mail/Send` - gRPC`/sender.Mail/Send`
- 白名单键:`sender.Mail.Send`
- 请求示例: - 请求示例:
```json ```json
@@ -55,7 +54,6 @@
- 动态 HTTP`POST /rpc/sender/Sms/Send` - 动态 HTTP`POST /rpc/sender/Sms/Send`
- gRPC`/sender.Sms/Send` - gRPC`/sender.Sms/Send`
- 白名单键:`sender.Sms.Send`
- 请求示例: - 请求示例:
```json ```json
@@ -75,7 +73,6 @@
- 动态 HTTP`POST /rpc/sender/Sms/Verify` - 动态 HTTP`POST /rpc/sender/Sms/Verify`
- gRPC`/sender.Sms/Verify` - gRPC`/sender.Sms/Verify`
- 白名单键:`sender.Sms.Verify`
- 请求示例: - 请求示例:
```json ```json

View File

@@ -9,7 +9,7 @@
- 动态 HTTP`POST /rpc/address/{Service}/{Method}` - 动态 HTTP`POST /rpc/address/{Service}/{Method}`
- 原生 gRPC`/address.{Service}/{Method}` - 原生 gRPC`/address.{Service}/{Method}`
- grpc-gateway`POST /address.{Service}/{Method}` - grpc-gateway`POST /address.{Service}/{Method}`
- 鉴权:需要登录的接口通过 `Authorization: Bearer <token>` 传递凭证 - 鉴权:需要登录的接口通过 `Authorization: <JWT>` 传递裸 JWT不添加 `Bearer` 前缀
- 动态 HTTP 成功或失败均返回 HTTP 200业务状态见 `code``message``details` - 动态 HTTP 成功或失败均返回 HTTP 200业务状态见 `code``message``details`
## 服务概览 ## 服务概览
@@ -32,7 +32,6 @@
- 动态 HTTP`POST /rpc/address/Library/Create` - 动态 HTTP`POST /rpc/address/Library/Create`
- gRPC`/address.Library/Create` - gRPC`/address.Library/Create`
- 白名单键:`address.Library.Create`
- 请求示例: - 请求示例:
```json ```json
@@ -54,7 +53,6 @@
- 动态 HTTP`POST /rpc/address/Library/Modify` - 动态 HTTP`POST /rpc/address/Library/Modify`
- gRPC`/address.Library/Modify` - gRPC`/address.Library/Modify`
- 白名单键:`address.Library.Modify`
- 请求示例: - 请求示例:
```json ```json
@@ -78,7 +76,6 @@
- 动态 HTTP`POST /rpc/address/Library/Get` - 动态 HTTP`POST /rpc/address/Library/Get`
- gRPC`/address.Library/Get` - gRPC`/address.Library/Get`
- 白名单键:`address.Library.Get`
- 请求示例: - 请求示例:
```json ```json
@@ -92,7 +89,6 @@
- 动态 HTTP`POST /rpc/address/Library/Fetch` - 动态 HTTP`POST /rpc/address/Library/Fetch`
- gRPC`/address.Library/Fetch` - gRPC`/address.Library/Fetch`
- 白名单键:`address.Library.Fetch`
- 请求示例: - 请求示例:
```json ```json
@@ -106,7 +102,6 @@
- 动态 HTTP`POST /rpc/address/Library/Delete` - 动态 HTTP`POST /rpc/address/Library/Delete`
- gRPC`/address.Library/Delete` - gRPC`/address.Library/Delete`
- 白名单键:`address.Library.Delete`
- 请求示例: - 请求示例:
```json ```json

View File

@@ -9,7 +9,7 @@
- 动态 HTTP`POST /rpc/mall/{Service}/{Method}` - 动态 HTTP`POST /rpc/mall/{Service}/{Method}`
- 原生 gRPC`/mall.{Service}/{Method}` - 原生 gRPC`/mall.{Service}/{Method}`
- grpc-gateway`POST /mall.{Service}/{Method}` - grpc-gateway`POST /mall.{Service}/{Method}`
- 鉴权:需要登录的接口通过 `Authorization: Bearer <token>` 传递凭证 - 鉴权:需要登录的接口通过 `Authorization: <JWT>` 传递裸 JWT不添加 `Bearer` 前缀
- 动态 HTTP 成功或失败均返回 HTTP 200业务状态见 `code``message``details` - 动态 HTTP 成功或失败均返回 HTTP 200业务状态见 `code``message``details`
## 服务概览 ## 服务概览
@@ -38,7 +38,6 @@
- 动态 HTTP`POST /rpc/mall/Ads/ByPos` - 动态 HTTP`POST /rpc/mall/Ads/ByPos`
- gRPC`/mall.Ads/ByPos` - gRPC`/mall.Ads/ByPos`
- 白名单键:`mall.Ads.ByPos`
- 请求示例: - 请求示例:
```json ```json
@@ -54,7 +53,6 @@
- 动态 HTTP`POST /rpc/mall/Ads/Fetch` - 动态 HTTP`POST /rpc/mall/Ads/Fetch`
- gRPC`/mall.Ads/Fetch` - gRPC`/mall.Ads/Fetch`
- 白名单键:`mall.Ads.Fetch`
- 请求示例: - 请求示例:
```json ```json
@@ -79,7 +77,6 @@
- 动态 HTTP`POST /rpc/mall/Ads/Create` - 动态 HTTP`POST /rpc/mall/Ads/Create`
- gRPC`/mall.Ads/Create` - gRPC`/mall.Ads/Create`
- 白名单键:`mall.Ads.Create`
- 请求示例: - 请求示例:
```json ```json
@@ -99,7 +96,6 @@
- 动态 HTTP`POST /rpc/mall/Ads/Modify` - 动态 HTTP`POST /rpc/mall/Ads/Modify`
- gRPC`/mall.Ads/Modify` - gRPC`/mall.Ads/Modify`
- 白名单键:`mall.Ads.Modify`
- 请求示例: - 请求示例:
```json ```json
@@ -119,7 +115,6 @@
- 动态 HTTP`POST /rpc/mall/Ads/Delete` - 动态 HTTP`POST /rpc/mall/Ads/Delete`
- gRPC`/mall.Ads/Delete` - gRPC`/mall.Ads/Delete`
- 白名单键:`mall.Ads.Delete`
- 请求示例: - 请求示例:
```json ```json
@@ -142,7 +137,6 @@
- 动态 HTTP`POST /rpc/mall/Category/Fetch` - 动态 HTTP`POST /rpc/mall/Category/Fetch`
- gRPC`/mall.Category/Fetch` - gRPC`/mall.Category/Fetch`
- 白名单键:`mall.Category.Fetch`
- 请求示例: - 请求示例:
```json ```json
@@ -158,7 +152,6 @@
- 动态 HTTP`POST /rpc/mall/Category/Create` - 动态 HTTP`POST /rpc/mall/Category/Create`
- gRPC`/mall.Category/Create` - gRPC`/mall.Category/Create`
- 白名单键:`mall.Category.Create`
- 请求示例: - 请求示例:
```json ```json
@@ -185,7 +178,6 @@
- 动态 HTTP`POST /rpc/mall/Category/Delete` - 动态 HTTP`POST /rpc/mall/Category/Delete`
- gRPC`/mall.Category/Delete` - gRPC`/mall.Category/Delete`
- 白名单键:`mall.Category.Delete`
- 请求示例: - 请求示例:
```json ```json
@@ -199,7 +191,6 @@
- 动态 HTTP`POST /rpc/mall/Category/Modify` - 动态 HTTP`POST /rpc/mall/Category/Modify`
- gRPC`/mall.Category/Modify` - gRPC`/mall.Category/Modify`
- 白名单键:`mall.Category.Modify`
- 请求示例: - 请求示例:
```json ```json
@@ -240,7 +231,6 @@
- 动态 HTTP`POST /rpc/mall/Freight/Fetch` - 动态 HTTP`POST /rpc/mall/Freight/Fetch`
- gRPC`/mall.Freight/Fetch` - gRPC`/mall.Freight/Fetch`
- 白名单键:`mall.Freight.Fetch`
- 请求示例: - 请求示例:
```json ```json
@@ -265,7 +255,6 @@
- 动态 HTTP`POST /rpc/mall/Freight/Modify` - 动态 HTTP`POST /rpc/mall/Freight/Modify`
- gRPC`/mall.Freight/Modify` - gRPC`/mall.Freight/Modify`
- 白名单键:`mall.Freight.Modify`
- 请求示例: - 请求示例:
```json ```json
@@ -308,7 +297,6 @@
- 动态 HTTP`POST /rpc/mall/Freight/Delete` - 动态 HTTP`POST /rpc/mall/Freight/Delete`
- gRPC`/mall.Freight/Delete` - gRPC`/mall.Freight/Delete`
- 白名单键:`mall.Freight.Delete`
- 请求示例: - 请求示例:
```json ```json
@@ -322,7 +310,6 @@
- 动态 HTTP`POST /rpc/mall/Freight/Create` - 动态 HTTP`POST /rpc/mall/Freight/Create`
- gRPC`/mall.Freight/Create` - gRPC`/mall.Freight/Create`
- 白名单键:`mall.Freight.Create`
- 请求示例: - 请求示例:
```json ```json
@@ -365,7 +352,6 @@
- 动态 HTTP`POST /rpc/mall/Freight/Detail` - 动态 HTTP`POST /rpc/mall/Freight/Detail`
- gRPC`/mall.Freight/Detail` - gRPC`/mall.Freight/Detail`
- 白名单键:`mall.Freight.Detail`
- 请求示例: - 请求示例:
```json ```json
@@ -379,7 +365,6 @@
- 动态 HTTP`POST /rpc/mall/Freight/DenyRegionFetch` - 动态 HTTP`POST /rpc/mall/Freight/DenyRegionFetch`
- gRPC`/mall.Freight/DenyRegionFetch` - gRPC`/mall.Freight/DenyRegionFetch`
- 白名单键:`mall.Freight.DenyRegionFetch`
- 请求示例: - 请求示例:
```json ```json
@@ -404,7 +389,6 @@
- 动态 HTTP`POST /rpc/mall/Freight/DenyRegionCreate` - 动态 HTTP`POST /rpc/mall/Freight/DenyRegionCreate`
- gRPC`/mall.Freight/DenyRegionCreate` - gRPC`/mall.Freight/DenyRegionCreate`
- 白名单键:`mall.Freight.DenyRegionCreate`
- 请求示例: - 请求示例:
```json ```json
@@ -429,7 +413,6 @@
- 动态 HTTP`POST /rpc/mall/Freight/DenyRegionDelete` - 动态 HTTP`POST /rpc/mall/Freight/DenyRegionDelete`
- gRPC`/mall.Freight/DenyRegionDelete` - gRPC`/mall.Freight/DenyRegionDelete`
- 白名单键:`mall.Freight.DenyRegionDelete`
- 请求示例: - 请求示例:
```json ```json
@@ -443,7 +426,6 @@
- 动态 HTTP`POST /rpc/mall/Freight/DenyRegionModify` - 动态 HTTP`POST /rpc/mall/Freight/DenyRegionModify`
- gRPC`/mall.Freight/DenyRegionModify` - gRPC`/mall.Freight/DenyRegionModify`
- 白名单键:`mall.Freight.DenyRegionModify`
- 请求示例: - 请求示例:
```json ```json
@@ -477,7 +459,6 @@
- 动态 HTTP`POST /rpc/mall/Notice/Fetch` - 动态 HTTP`POST /rpc/mall/Notice/Fetch`
- gRPC`/mall.Notice/Fetch` - gRPC`/mall.Notice/Fetch`
- 白名单键:`mall.Notice.Fetch`
- 请求示例: - 请求示例:
```json ```json
@@ -502,7 +483,6 @@
- 动态 HTTP`POST /rpc/mall/Notice/Create` - 动态 HTTP`POST /rpc/mall/Notice/Create`
- gRPC`/mall.Notice/Create` - gRPC`/mall.Notice/Create`
- 白名单键:`mall.Notice.Create`
- 请求示例: - 请求示例:
```json ```json
@@ -522,7 +502,6 @@
- 动态 HTTP`POST /rpc/mall/Notice/Modify` - 动态 HTTP`POST /rpc/mall/Notice/Modify`
- gRPC`/mall.Notice/Modify` - gRPC`/mall.Notice/Modify`
- 白名单键:`mall.Notice.Modify`
- 请求示例: - 请求示例:
```json ```json
@@ -542,7 +521,6 @@
- 动态 HTTP`POST /rpc/mall/Notice/Delete` - 动态 HTTP`POST /rpc/mall/Notice/Delete`
- gRPC`/mall.Notice/Delete` - gRPC`/mall.Notice/Delete`
- 白名单键:`mall.Notice.Delete`
- 请求示例: - 请求示例:
```json ```json
@@ -582,7 +560,6 @@
- 动态 HTTP`POST /rpc/mall/Product/ItemFetch` - 动态 HTTP`POST /rpc/mall/Product/ItemFetch`
- gRPC`/mall.Product/ItemFetch` - gRPC`/mall.Product/ItemFetch`
- 白名单键:`mall.Product.ItemFetch`
- 请求示例: - 请求示例:
```json ```json
@@ -607,7 +584,6 @@
- 动态 HTTP`POST /rpc/mall/Product/ItemDetail` - 动态 HTTP`POST /rpc/mall/Product/ItemDetail`
- gRPC`/mall.Product/ItemDetail` - gRPC`/mall.Product/ItemDetail`
- 白名单键:`mall.Product.ItemDetail`
- 请求示例: - 请求示例:
```json ```json
@@ -621,7 +597,6 @@
- 动态 HTTP`POST /rpc/mall/Product/ItemDetailBySerial` - 动态 HTTP`POST /rpc/mall/Product/ItemDetailBySerial`
- gRPC`/mall.Product/ItemDetailBySerial` - gRPC`/mall.Product/ItemDetailBySerial`
- 白名单键:`mall.Product.ItemDetailBySerial`
- 请求示例: - 请求示例:
```json ```json
@@ -637,7 +612,6 @@
- 动态 HTTP`POST /rpc/mall/Product/ItemDetailBySpec` - 动态 HTTP`POST /rpc/mall/Product/ItemDetailBySpec`
- gRPC`/mall.Product/ItemDetailBySpec` - gRPC`/mall.Product/ItemDetailBySpec`
- 白名单键:`mall.Product.ItemDetailBySpec`
- 请求示例: - 请求示例:
```json ```json
@@ -650,7 +624,6 @@
- 动态 HTTP`POST /rpc/mall/Product/ItemCreate` - 动态 HTTP`POST /rpc/mall/Product/ItemCreate`
- gRPC`/mall.Product/ItemCreate` - gRPC`/mall.Product/ItemCreate`
- 白名单键:`mall.Product.ItemCreate`
- 请求示例: - 请求示例:
```json ```json
@@ -749,7 +722,6 @@
- 动态 HTTP`POST /rpc/mall/Product/ItemDelete` - 动态 HTTP`POST /rpc/mall/Product/ItemDelete`
- gRPC`/mall.Product/ItemDelete` - gRPC`/mall.Product/ItemDelete`
- 白名单键:`mall.Product.ItemDelete`
- 请求示例: - 请求示例:
```json ```json
@@ -763,7 +735,6 @@
- 动态 HTTP`POST /rpc/mall/Product/ItemModify` - 动态 HTTP`POST /rpc/mall/Product/ItemModify`
- gRPC`/mall.Product/ItemModify` - gRPC`/mall.Product/ItemModify`
- 白名单键:`mall.Product.ItemModify`
- 请求示例: - 请求示例:
```json ```json
@@ -777,7 +748,6 @@
- 动态 HTTP`POST /rpc/mall/Product/ItemBatchOp` - 动态 HTTP`POST /rpc/mall/Product/ItemBatchOp`
- gRPC`/mall.Product/ItemBatchOp` - gRPC`/mall.Product/ItemBatchOp`
- 白名单键:`mall.Product.ItemBatchOp`
- 请求示例: - 请求示例:
```json ```json
@@ -793,7 +763,6 @@
- 动态 HTTP`POST /rpc/mall/Product/SpecFetch` - 动态 HTTP`POST /rpc/mall/Product/SpecFetch`
- gRPC`/mall.Product/SpecFetch` - gRPC`/mall.Product/SpecFetch`
- 白名单键:`mall.Product.SpecFetch`
- 请求示例: - 请求示例:
```json ```json
@@ -818,7 +787,6 @@
- 动态 HTTP`POST /rpc/mall/Product/SpecCreate` - 动态 HTTP`POST /rpc/mall/Product/SpecCreate`
- gRPC`/mall.Product/SpecCreate` - gRPC`/mall.Product/SpecCreate`
- 白名单键:`mall.Product.SpecCreate`
- 请求示例: - 请求示例:
```json ```json
@@ -847,7 +815,6 @@
- 动态 HTTP`POST /rpc/mall/Product/SpecModify` - 动态 HTTP`POST /rpc/mall/Product/SpecModify`
- gRPC`/mall.Product/SpecModify` - gRPC`/mall.Product/SpecModify`
- 白名单键:`mall.Product.SpecModify`
- 请求示例: - 请求示例:
```json ```json
@@ -876,7 +843,6 @@
- 动态 HTTP`POST /rpc/mall/Product/SpecDelete` - 动态 HTTP`POST /rpc/mall/Product/SpecDelete`
- gRPC`/mall.Product/SpecDelete` - gRPC`/mall.Product/SpecDelete`
- 白名单键:`mall.Product.SpecDelete`
- 请求示例: - 请求示例:
```json ```json
@@ -890,7 +856,6 @@
- 动态 HTTP`POST /rpc/mall/Product/SpecDetail` - 动态 HTTP`POST /rpc/mall/Product/SpecDetail`
- gRPC`/mall.Product/SpecDetail` - gRPC`/mall.Product/SpecDetail`
- 白名单键:`mall.Product.SpecDetail`
- 请求示例: - 请求示例:
```json ```json
@@ -904,7 +869,6 @@
- 动态 HTTP`POST /rpc/mall/Product/PhotoCreate` - 动态 HTTP`POST /rpc/mall/Product/PhotoCreate`
- gRPC`/mall.Product/PhotoCreate` - gRPC`/mall.Product/PhotoCreate`
- 白名单键:`mall.Product.PhotoCreate`
- 请求示例: - 请求示例:
```json ```json
@@ -923,7 +887,6 @@
- 动态 HTTP`POST /rpc/mall/Product/PhotoDelete` - 动态 HTTP`POST /rpc/mall/Product/PhotoDelete`
- gRPC`/mall.Product/PhotoDelete` - gRPC`/mall.Product/PhotoDelete`
- 白名单键:`mall.Product.PhotoDelete`
- 请求示例: - 请求示例:
```json ```json
@@ -937,7 +900,6 @@
- 动态 HTTP`POST /rpc/mall/Product/PhotoList` - 动态 HTTP`POST /rpc/mall/Product/PhotoList`
- gRPC`/mall.Product/PhotoList` - gRPC`/mall.Product/PhotoList`
- 白名单键:`mall.Product.PhotoList`
- 请求示例: - 请求示例:
```json ```json
@@ -956,7 +918,6 @@
- 动态 HTTP`POST /rpc/mall/Product/CommentFetch` - 动态 HTTP`POST /rpc/mall/Product/CommentFetch`
- gRPC`/mall.Product/CommentFetch` - gRPC`/mall.Product/CommentFetch`
- 白名单键:`mall.Product.CommentFetch`
- 请求示例: - 请求示例:
```json ```json
@@ -981,7 +942,6 @@
- 动态 HTTP`POST /rpc/mall/Product/CommentCreate` - 动态 HTTP`POST /rpc/mall/Product/CommentCreate`
- gRPC`/mall.Product/CommentCreate` - gRPC`/mall.Product/CommentCreate`
- 白名单键:`mall.Product.CommentCreate`
- 请求示例: - 请求示例:
```json ```json
@@ -1007,7 +967,6 @@
- 动态 HTTP`POST /rpc/mall/Product/CommentRe` - 动态 HTTP`POST /rpc/mall/Product/CommentRe`
- gRPC`/mall.Product/CommentRe` - gRPC`/mall.Product/CommentRe`
- 白名单键:`mall.Product.CommentRe`
- 请求示例: - 请求示例:
```json ```json
@@ -1033,7 +992,6 @@
- 动态 HTTP`POST /rpc/mall/Product/CommentDelete` - 动态 HTTP`POST /rpc/mall/Product/CommentDelete`
- gRPC`/mall.Product/CommentDelete` - gRPC`/mall.Product/CommentDelete`
- 白名单键:`mall.Product.CommentDelete`
- 请求示例: - 请求示例:
```json ```json
@@ -1047,7 +1005,6 @@
- 动态 HTTP`POST /rpc/mall/Product/CommentModify` - 动态 HTTP`POST /rpc/mall/Product/CommentModify`
- gRPC`/mall.Product/CommentModify` - gRPC`/mall.Product/CommentModify`
- 白名单键:`mall.Product.CommentModify`
- 请求示例: - 请求示例:
```json ```json
@@ -1085,7 +1042,6 @@
- 动态 HTTP`POST /rpc/mall/Staff/Login` - 动态 HTTP`POST /rpc/mall/Staff/Login`
- gRPC`/mall.Staff/Login` - gRPC`/mall.Staff/Login`
- 白名单键:`mall.Staff.Login`
- 请求示例: - 请求示例:
```json ```json
@@ -1102,7 +1058,6 @@
- 动态 HTTP`POST /rpc/mall/Staff/Fetch` - 动态 HTTP`POST /rpc/mall/Staff/Fetch`
- gRPC`/mall.Staff/Fetch` - gRPC`/mall.Staff/Fetch`
- 白名单键:`mall.Staff.Fetch`
- 请求示例: - 请求示例:
```json ```json
@@ -1127,7 +1082,6 @@
- 动态 HTTP`POST /rpc/mall/Staff/Create` - 动态 HTTP`POST /rpc/mall/Staff/Create`
- gRPC`/mall.Staff/Create` - gRPC`/mall.Staff/Create`
- 白名单键:`mall.Staff.Create`
- 请求示例: - 请求示例:
```json ```json
@@ -1151,7 +1105,6 @@
- 动态 HTTP`POST /rpc/mall/Staff/Delete` - 动态 HTTP`POST /rpc/mall/Staff/Delete`
- gRPC`/mall.Staff/Delete` - gRPC`/mall.Staff/Delete`
- 白名单键:`mall.Staff.Delete`
- 请求示例: - 请求示例:
```json ```json
@@ -1165,7 +1118,6 @@
- 动态 HTTP`POST /rpc/mall/Staff/GetProfile` - 动态 HTTP`POST /rpc/mall/Staff/GetProfile`
- gRPC`/mall.Staff/GetProfile` - gRPC`/mall.Staff/GetProfile`
- 白名单键:`mall.Staff.GetProfile`
- 请求示例: - 请求示例:
```json ```json
@@ -1179,7 +1131,6 @@
- 动态 HTTP`POST /rpc/mall/Staff/SetProfile` - 动态 HTTP`POST /rpc/mall/Staff/SetProfile`
- gRPC`/mall.Staff/SetProfile` - gRPC`/mall.Staff/SetProfile`
- 白名单键:`mall.Staff.SetProfile`
- 请求示例: - 请求示例:
```json ```json
@@ -1203,7 +1154,6 @@
- 动态 HTTP`POST /rpc/mall/Staff/SetPassword` - 动态 HTTP`POST /rpc/mall/Staff/SetPassword`
- gRPC`/mall.Staff/SetPassword` - gRPC`/mall.Staff/SetPassword`
- 白名单键:`mall.Staff.SetPassword`
- 请求示例: - 请求示例:
```json ```json
@@ -1233,7 +1183,6 @@
- 动态 HTTP`POST /rpc/mall/Store/ApplyJoin` - 动态 HTTP`POST /rpc/mall/Store/ApplyJoin`
- gRPC`/mall.Store/ApplyJoin` - gRPC`/mall.Store/ApplyJoin`
- 白名单键:`mall.Store.ApplyJoin`
- 请求示例: - 请求示例:
```json ```json
@@ -1257,7 +1206,6 @@
- 动态 HTTP`POST /rpc/mall/Store/Licensing` - 动态 HTTP`POST /rpc/mall/Store/Licensing`
- gRPC`/mall.Store/Licensing` - gRPC`/mall.Store/Licensing`
- 白名单键:`mall.Store.Licensing`
- 请求示例: - 请求示例:
```json ```json
@@ -1274,7 +1222,6 @@
- 动态 HTTP`POST /rpc/mall/Store/GetSetting` - 动态 HTTP`POST /rpc/mall/Store/GetSetting`
- gRPC`/mall.Store/GetSetting` - gRPC`/mall.Store/GetSetting`
- 白名单键:`mall.Store.GetSetting`
- 请求示例: - 请求示例:
```json ```json
@@ -1288,7 +1235,6 @@
- 动态 HTTP`POST /rpc/mall/Store/SetSetting` - 动态 HTTP`POST /rpc/mall/Store/SetSetting`
- gRPC`/mall.Store/SetSetting` - gRPC`/mall.Store/SetSetting`
- 白名单键:`mall.Store.SetSetting`
- 请求示例: - 请求示例:
```json ```json
@@ -1312,7 +1258,6 @@
- 动态 HTTP`POST /rpc/mall/Store/SetPayment` - 动态 HTTP`POST /rpc/mall/Store/SetPayment`
- gRPC`/mall.Store/SetPayment` - gRPC`/mall.Store/SetPayment`
- 白名单键:`mall.Store.SetPayment`
- 请求示例: - 请求示例:
```json ```json
@@ -1326,7 +1271,6 @@
- 动态 HTTP`POST /rpc/mall/Store/SetEmail` - 动态 HTTP`POST /rpc/mall/Store/SetEmail`
- gRPC`/mall.Store/SetEmail` - gRPC`/mall.Store/SetEmail`
- 白名单键:`mall.Store.SetEmail`
- 请求示例: - 请求示例:
```json ```json
@@ -1340,7 +1284,6 @@
- 动态 HTTP`POST /rpc/mall/Store/GetPayment` - 动态 HTTP`POST /rpc/mall/Store/GetPayment`
- gRPC`/mall.Store/GetPayment` - gRPC`/mall.Store/GetPayment`
- 白名单键:`mall.Store.GetPayment`
- 请求示例: - 请求示例:
```json ```json
@@ -1354,7 +1297,6 @@
- 动态 HTTP`POST /rpc/mall/Store/GetEmail` - 动态 HTTP`POST /rpc/mall/Store/GetEmail`
- gRPC`/mall.Store/GetEmail` - gRPC`/mall.Store/GetEmail`
- 白名单键:`mall.Store.GetEmail`
- 请求示例: - 请求示例:
```json ```json
@@ -1368,7 +1310,6 @@
- 动态 HTTP`POST /rpc/mall/Store/MiniCode` - 动态 HTTP`POST /rpc/mall/Store/MiniCode`
- gRPC`/mall.Store/MiniCode` - gRPC`/mall.Store/MiniCode`
- 白名单键:`mall.Store.MiniCode`
- 请求示例: - 请求示例:
```json ```json
@@ -1381,7 +1322,6 @@
- 动态 HTTP`POST /rpc/mall/Store/Search` - 动态 HTTP`POST /rpc/mall/Store/Search`
- gRPC`/mall.Store/Search` - gRPC`/mall.Store/Search`
- 白名单键:`mall.Store.Search`
- 请求示例: - 请求示例:
```json ```json

View File

@@ -9,7 +9,7 @@
- 动态 HTTP`POST /rpc/market/{Service}/{Method}` - 动态 HTTP`POST /rpc/market/{Service}/{Method}`
- 原生 gRPC`/market.{Service}/{Method}` - 原生 gRPC`/market.{Service}/{Method}`
- grpc-gateway`POST /market.{Service}/{Method}` - grpc-gateway`POST /market.{Service}/{Method}`
- 鉴权:需要登录的接口通过 `Authorization: Bearer <token>` 传递凭证 - 鉴权:需要登录的接口通过 `Authorization: <JWT>` 传递裸 JWT不添加 `Bearer` 前缀
- 动态 HTTP 成功或失败均返回 HTTP 200业务状态见 `code``message``details` - 动态 HTTP 成功或失败均返回 HTTP 200业务状态见 `code``message``details`
## 服务概览 ## 服务概览
@@ -38,7 +38,6 @@
- 动态 HTTP`POST /rpc/market/Agency/Login` - 动态 HTTP`POST /rpc/market/Agency/Login`
- gRPC`/market.Agency/Login` - gRPC`/market.Agency/Login`
- 白名单键:`market.Agency.Login`
- 请求示例: - 请求示例:
```json ```json
@@ -53,7 +52,6 @@
- 动态 HTTP`POST /rpc/market/Agency/Create` - 动态 HTTP`POST /rpc/market/Agency/Create`
- gRPC`/market.Agency/Create` - gRPC`/market.Agency/Create`
- 白名单键:`market.Agency.Create`
- 请求示例: - 请求示例:
```json ```json
@@ -85,7 +83,6 @@
- 动态 HTTP`POST /rpc/market/Agency/Get` - 动态 HTTP`POST /rpc/market/Agency/Get`
- gRPC`/market.Agency/Get` - gRPC`/market.Agency/Get`
- 白名单键:`market.Agency.Get`
- 请求示例: - 请求示例:
```json ```json
@@ -99,7 +96,6 @@
- 动态 HTTP`POST /rpc/market/Agency/Fetch` - 动态 HTTP`POST /rpc/market/Agency/Fetch`
- gRPC`/market.Agency/Fetch` - gRPC`/market.Agency/Fetch`
- 白名单键:`market.Agency.Fetch`
- 请求示例: - 请求示例:
```json ```json
@@ -120,7 +116,6 @@
- 动态 HTTP`POST /rpc/market/Agency/Modify` - 动态 HTTP`POST /rpc/market/Agency/Modify`
- gRPC`/market.Agency/Modify` - gRPC`/market.Agency/Modify`
- 白名单键:`market.Agency.Modify`
- 请求示例: - 请求示例:
```json ```json
@@ -152,7 +147,6 @@
- 动态 HTTP`POST /rpc/market/Agency/Delete` - 动态 HTTP`POST /rpc/market/Agency/Delete`
- gRPC`/market.Agency/Delete` - gRPC`/market.Agency/Delete`
- 白名单键:`market.Agency.Delete`
- 请求示例: - 请求示例:
```json ```json
@@ -166,7 +160,6 @@
- 动态 HTTP`POST /rpc/market/Agency/SetPassword` - 动态 HTTP`POST /rpc/market/Agency/SetPassword`
- gRPC`/market.Agency/SetPassword` - gRPC`/market.Agency/SetPassword`
- 白名单键:`market.Agency.SetPassword`
- 请求示例: - 请求示例:
```json ```json
@@ -181,7 +174,6 @@
- 动态 HTTP`POST /rpc/market/Agency/Pending` - 动态 HTTP`POST /rpc/market/Agency/Pending`
- gRPC`/market.Agency/Pending` - gRPC`/market.Agency/Pending`
- 白名单键:`market.Agency.Pending`
- 请求示例: - 请求示例:
```json ```json
@@ -202,7 +194,6 @@
- 动态 HTTP`POST /rpc/market/Agency/Approve` - 动态 HTTP`POST /rpc/market/Agency/Approve`
- gRPC`/market.Agency/Approve` - gRPC`/market.Agency/Approve`
- 白名单键:`market.Agency.Approve`
- 请求示例: - 请求示例:
```json ```json
@@ -226,7 +217,6 @@
- 动态 HTTP`POST /rpc/market/Data/Overview` - 动态 HTTP`POST /rpc/market/Data/Overview`
- gRPC`/market.Data/Overview` - gRPC`/market.Data/Overview`
- 白名单键:`market.Data.Overview`
- 请求示例: - 请求示例:
```json ```json
@@ -237,7 +227,6 @@
- 动态 HTTP`POST /rpc/market/Data/MemberFetch` - 动态 HTTP`POST /rpc/market/Data/MemberFetch`
- gRPC`/market.Data/MemberFetch` - gRPC`/market.Data/MemberFetch`
- 白名单键:`market.Data.MemberFetch`
- 请求示例: - 请求示例:
```json ```json
@@ -258,7 +247,6 @@
- 动态 HTTP`POST /rpc/market/Data/MemberDetails` - 动态 HTTP`POST /rpc/market/Data/MemberDetails`
- gRPC`/market.Data/MemberDetails` - gRPC`/market.Data/MemberDetails`
- 白名单键:`market.Data.MemberDetails`
- 请求示例: - 请求示例:
```json ```json
@@ -272,7 +260,6 @@
- 动态 HTTP`POST /rpc/market/Data/OrderFetch` - 动态 HTTP`POST /rpc/market/Data/OrderFetch`
- gRPC`/market.Data/OrderFetch` - gRPC`/market.Data/OrderFetch`
- 白名单键:`market.Data.OrderFetch`
- 请求示例: - 请求示例:
```json ```json
@@ -293,7 +280,6 @@
- 动态 HTTP`POST /rpc/market/Data/OrderDetails` - 动态 HTTP`POST /rpc/market/Data/OrderDetails`
- gRPC`/market.Data/OrderDetails` - gRPC`/market.Data/OrderDetails`
- 白名单键:`market.Data.OrderDetails`
- 请求示例: - 请求示例:
```json ```json
@@ -317,7 +303,6 @@
- 动态 HTTP`POST /rpc/market/Supply/Create` - 动态 HTTP`POST /rpc/market/Supply/Create`
- gRPC`/market.Supply/Create` - gRPC`/market.Supply/Create`
- 白名单键:`market.Supply.Create`
- 请求示例: - 请求示例:
```json ```json
@@ -344,7 +329,6 @@
- 动态 HTTP`POST /rpc/market/Supply/Get` - 动态 HTTP`POST /rpc/market/Supply/Get`
- gRPC`/market.Supply/Get` - gRPC`/market.Supply/Get`
- 白名单键:`market.Supply.Get`
- 请求示例: - 请求示例:
```json ```json
@@ -358,7 +342,6 @@
- 动态 HTTP`POST /rpc/market/Supply/Fetch` - 动态 HTTP`POST /rpc/market/Supply/Fetch`
- gRPC`/market.Supply/Fetch` - gRPC`/market.Supply/Fetch`
- 白名单键:`market.Supply.Fetch`
- 请求示例: - 请求示例:
```json ```json
@@ -379,7 +362,6 @@
- 动态 HTTP`POST /rpc/market/Supply/Modify` - 动态 HTTP`POST /rpc/market/Supply/Modify`
- gRPC`/market.Supply/Modify` - gRPC`/market.Supply/Modify`
- 白名单键:`market.Supply.Modify`
- 请求示例: - 请求示例:
```json ```json
@@ -406,7 +388,6 @@
- 动态 HTTP`POST /rpc/market/Supply/Delete` - 动态 HTTP`POST /rpc/market/Supply/Delete`
- gRPC`/market.Supply/Delete` - gRPC`/market.Supply/Delete`
- 白名单键:`market.Supply.Delete`
- 请求示例: - 请求示例:
```json ```json

View File

@@ -9,7 +9,7 @@
- 动态 HTTP`POST /rpc/order/{Service}/{Method}` - 动态 HTTP`POST /rpc/order/{Service}/{Method}`
- 原生 gRPC`/order.{Service}/{Method}` - 原生 gRPC`/order.{Service}/{Method}`
- grpc-gateway`POST /order.{Service}/{Method}` - grpc-gateway`POST /order.{Service}/{Method}`
- 鉴权:需要登录的接口通过 `Authorization: Bearer <token>` 传递凭证 - 鉴权:需要登录的接口通过 `Authorization: <JWT>` 传递裸 JWT不添加 `Bearer` 前缀
- 动态 HTTP 成功或失败均返回 HTTP 200业务状态见 `code``message``details` - 动态 HTTP 成功或失败均返回 HTTP 200业务状态见 `code``message``details`
## 服务概览 ## 服务概览
@@ -34,7 +34,6 @@
- 动态 HTTP`POST /rpc/order/Cart/Fetch` - 动态 HTTP`POST /rpc/order/Cart/Fetch`
- gRPC`/order.Cart/Fetch` - gRPC`/order.Cart/Fetch`
- 白名单键:`order.Cart.Fetch`
- 请求示例: - 请求示例:
```json ```json
@@ -49,7 +48,6 @@
- 动态 HTTP`POST /rpc/order/Cart/Create` - 动态 HTTP`POST /rpc/order/Cart/Create`
- gRPC`/order.Cart/Create` - gRPC`/order.Cart/Create`
- 白名单键:`order.Cart.Create`
- 请求示例: - 请求示例:
```json ```json
@@ -68,7 +66,6 @@
- 动态 HTTP`POST /rpc/order/Cart/Modify` - 动态 HTTP`POST /rpc/order/Cart/Modify`
- gRPC`/order.Cart/Modify` - gRPC`/order.Cart/Modify`
- 白名单键:`order.Cart.Modify`
- 请求示例: - 请求示例:
```json ```json
@@ -90,7 +87,6 @@
- 动态 HTTP`POST /rpc/order/Cart/Delete` - 动态 HTTP`POST /rpc/order/Cart/Delete`
- gRPC`/order.Cart/Delete` - gRPC`/order.Cart/Delete`
- 白名单键:`order.Cart.Delete`
- 请求示例: - 请求示例:
```json ```json
@@ -111,7 +107,6 @@
- 动态 HTTP`POST /rpc/order/Coupon/ByStatus` - 动态 HTTP`POST /rpc/order/Coupon/ByStatus`
- gRPC`/order.Coupon/ByStatus` - gRPC`/order.Coupon/ByStatus`
- 白名单键:`order.Coupon.ByStatus`
- 请求示例: - 请求示例:
```json ```json
@@ -136,7 +131,6 @@
- 动态 HTTP`POST /rpc/order/Mgt/OrderCreate` - 动态 HTTP`POST /rpc/order/Mgt/OrderCreate`
- gRPC`/order.Mgt/OrderCreate` - gRPC`/order.Mgt/OrderCreate`
- 白名单键:`order.Mgt.OrderCreate`
- 请求示例: - 请求示例:
```json ```json
@@ -158,7 +152,6 @@
- 动态 HTTP`POST /rpc/order/Mgt/OrderModify` - 动态 HTTP`POST /rpc/order/Mgt/OrderModify`
- gRPC`/order.Mgt/OrderModify` - gRPC`/order.Mgt/OrderModify`
- 白名单键:`order.Mgt.OrderModify`
- 请求示例: - 请求示例:
```json ```json
@@ -227,7 +220,6 @@
- 动态 HTTP`POST /rpc/order/Mgt/OrderGet` - 动态 HTTP`POST /rpc/order/Mgt/OrderGet`
- gRPC`/order.Mgt/OrderGet` - gRPC`/order.Mgt/OrderGet`
- 白名单键:`order.Mgt.OrderGet`
- 请求示例: - 请求示例:
```json ```json
@@ -245,7 +237,6 @@
- 动态 HTTP`POST /rpc/order/Mgt/OrderListByStore` - 动态 HTTP`POST /rpc/order/Mgt/OrderListByStore`
- gRPC`/order.Mgt/OrderListByStore` - gRPC`/order.Mgt/OrderListByStore`
- 白名单键:`order.Mgt.OrderListByStore`
- 请求示例: - 请求示例:
```json ```json
@@ -268,7 +259,6 @@
- 动态 HTTP`POST /rpc/order/Mgt/OrderCancel` - 动态 HTTP`POST /rpc/order/Mgt/OrderCancel`
- gRPC`/order.Mgt/OrderCancel` - gRPC`/order.Mgt/OrderCancel`
- 白名单键:`order.Mgt.OrderCancel`
- 请求示例: - 请求示例:
```json ```json
@@ -286,7 +276,6 @@
- 动态 HTTP`POST /rpc/order/Mgt/OrderReturnable` - 动态 HTTP`POST /rpc/order/Mgt/OrderReturnable`
- gRPC`/order.Mgt/OrderReturnable` - gRPC`/order.Mgt/OrderReturnable`
- 白名单键:`order.Mgt.OrderReturnable`
- 请求示例: - 请求示例:
```json ```json
@@ -304,7 +293,6 @@
- 动态 HTTP`POST /rpc/order/Mgt/OrderApprove` - 动态 HTTP`POST /rpc/order/Mgt/OrderApprove`
- gRPC`/order.Mgt/OrderApprove` - gRPC`/order.Mgt/OrderApprove`
- 白名单键:`order.Mgt.OrderApprove`
- 请求示例: - 请求示例:
```json ```json
@@ -337,7 +325,6 @@
- 动态 HTTP`POST /rpc/order/Summary/QuickCreateByProduct` - 动态 HTTP`POST /rpc/order/Summary/QuickCreateByProduct`
- gRPC`/order.Summary/QuickCreateByProduct` - gRPC`/order.Summary/QuickCreateByProduct`
- 白名单键:`order.Summary.QuickCreateByProduct`
- 请求示例: - 请求示例:
```json ```json
@@ -359,7 +346,6 @@
- 动态 HTTP`POST /rpc/order/Summary/Submit` - 动态 HTTP`POST /rpc/order/Summary/Submit`
- gRPC`/order.Summary/Submit` - gRPC`/order.Summary/Submit`
- 白名单键:`order.Summary.Submit`
- 请求示例: - 请求示例:
```json ```json
@@ -389,7 +375,6 @@
- 动态 HTTP`POST /rpc/order/Summary/Check` - 动态 HTTP`POST /rpc/order/Summary/Check`
- gRPC`/order.Summary/Check` - gRPC`/order.Summary/Check`
- 白名单键:`order.Summary.Check`
- 请求示例: - 请求示例:
```json ```json
@@ -400,7 +385,6 @@
- 动态 HTTP`POST /rpc/order/Summary/Get` - 动态 HTTP`POST /rpc/order/Summary/Get`
- gRPC`/order.Summary/Get` - gRPC`/order.Summary/Get`
- 白名单键:`order.Summary.Get`
- 请求示例: - 请求示例:
```json ```json
@@ -418,7 +402,6 @@
- 动态 HTTP`POST /rpc/order/Summary/List` - 动态 HTTP`POST /rpc/order/Summary/List`
- gRPC`/order.Summary/List` - gRPC`/order.Summary/List`
- 白名单键:`order.Summary.List`
- 请求示例: - 请求示例:
```json ```json
@@ -434,7 +417,6 @@
- 动态 HTTP`POST /rpc/order/Summary/Confirm` - 动态 HTTP`POST /rpc/order/Summary/Confirm`
- gRPC`/order.Summary/Confirm` - gRPC`/order.Summary/Confirm`
- 白名单键:`order.Summary.Confirm`
- 请求示例: - 请求示例:
```json ```json
@@ -451,7 +433,6 @@
- 动态 HTTP`POST /rpc/order/Summary/Cancel` - 动态 HTTP`POST /rpc/order/Summary/Cancel`
- gRPC`/order.Summary/Cancel` - gRPC`/order.Summary/Cancel`
- 白名单键:`order.Summary.Cancel`
- 请求示例: - 请求示例:
```json ```json
@@ -465,7 +446,6 @@
- 动态 HTTP`POST /rpc/order/Summary/SimulatePay` - 动态 HTTP`POST /rpc/order/Summary/SimulatePay`
- gRPC`/order.Summary/SimulatePay` - gRPC`/order.Summary/SimulatePay`
- 白名单键:`order.Summary.SimulatePay`
- 请求示例: - 请求示例:
```json ```json
@@ -480,7 +460,6 @@
- 动态 HTTP`POST /rpc/order/Summary/SimulateShipments` - 动态 HTTP`POST /rpc/order/Summary/SimulateShipments`
- gRPC`/order.Summary/SimulateShipments` - gRPC`/order.Summary/SimulateShipments`
- 白名单键:`order.Summary.SimulateShipments`
- 请求示例: - 请求示例:
```json ```json
@@ -496,7 +475,6 @@
- 动态 HTTP`POST /rpc/order/Summary/SimulateReceiving` - 动态 HTTP`POST /rpc/order/Summary/SimulateReceiving`
- gRPC`/order.Summary/SimulateReceiving` - gRPC`/order.Summary/SimulateReceiving`
- 白名单键:`order.Summary.SimulateReceiving`
- 请求示例: - 请求示例:
```json ```json

View File

@@ -9,7 +9,7 @@
- 动态 HTTP`POST /rpc/wallet/{Service}/{Method}` - 动态 HTTP`POST /rpc/wallet/{Service}/{Method}`
- 原生 gRPC`/wallet.{Service}/{Method}` - 原生 gRPC`/wallet.{Service}/{Method}`
- grpc-gateway`POST /wallet.{Service}/{Method}` - grpc-gateway`POST /wallet.{Service}/{Method}`
- 鉴权:需要登录的接口通过 `Authorization: Bearer <token>` 传递凭证 - 鉴权:需要登录的接口通过 `Authorization: <JWT>` 传递裸 JWT不添加 `Bearer` 前缀
- 动态 HTTP 成功或失败均返回 HTTP 200业务状态见 `code``message``details` - 动态 HTTP 成功或失败均返回 HTTP 200业务状态见 `code``message``details`
## 服务概览 ## 服务概览
@@ -34,7 +34,6 @@
- 动态 HTTP`POST /rpc/wallet/Alipay/WapPay` - 动态 HTTP`POST /rpc/wallet/Alipay/WapPay`
- gRPC`/wallet.Alipay/WapPay` - gRPC`/wallet.Alipay/WapPay`
- 白名单键:`wallet.Alipay.WapPay`
- 请求示例: - 请求示例:
```json ```json
@@ -51,7 +50,6 @@
- 动态 HTTP`POST /rpc/wallet/Alipay/PagePay` - 动态 HTTP`POST /rpc/wallet/Alipay/PagePay`
- gRPC`/wallet.Alipay/PagePay` - gRPC`/wallet.Alipay/PagePay`
- 白名单键:`wallet.Alipay.PagePay`
- 请求示例: - 请求示例:
```json ```json
@@ -68,7 +66,6 @@
- 动态 HTTP`POST /rpc/wallet/Alipay/AppPay` - 动态 HTTP`POST /rpc/wallet/Alipay/AppPay`
- gRPC`/wallet.Alipay/AppPay` - gRPC`/wallet.Alipay/AppPay`
- 白名单键:`wallet.Alipay.AppPay`
- 请求示例: - 请求示例:
```json ```json
@@ -84,7 +81,6 @@
- 动态 HTTP`POST /rpc/wallet/Alipay/Transfer` - 动态 HTTP`POST /rpc/wallet/Alipay/Transfer`
- gRPC`/wallet.Alipay/Transfer` - gRPC`/wallet.Alipay/Transfer`
- 白名单键:`wallet.Alipay.Transfer`
- 请求示例: - 请求示例:
```json ```json
@@ -113,7 +109,6 @@
- 动态 HTTP`POST /rpc/wallet/Basic/GetWallet` - 动态 HTTP`POST /rpc/wallet/Basic/GetWallet`
- gRPC`/wallet.Basic/GetWallet` - gRPC`/wallet.Basic/GetWallet`
- 白名单键:`wallet.Basic.GetWallet`
- 请求示例: - 请求示例:
```json ```json
@@ -131,7 +126,6 @@
- 动态 HTTP`POST /rpc/wallet/Basic/SetPayPassword` - 动态 HTTP`POST /rpc/wallet/Basic/SetPayPassword`
- gRPC`/wallet.Basic/SetPayPassword` - gRPC`/wallet.Basic/SetPayPassword`
- 白名单键:`wallet.Basic.SetPayPassword`
- 请求示例: - 请求示例:
```json ```json
@@ -145,7 +139,6 @@
- 动态 HTTP`POST /rpc/wallet/Basic/BindPaymentId` - 动态 HTTP`POST /rpc/wallet/Basic/BindPaymentId`
- gRPC`/wallet.Basic/BindPaymentId` - gRPC`/wallet.Basic/BindPaymentId`
- 白名单键:`wallet.Basic.BindPaymentId`
- 请求示例: - 请求示例:
```json ```json
@@ -159,7 +152,6 @@
- 动态 HTTP`POST /rpc/wallet/Basic/Transactions` - 动态 HTTP`POST /rpc/wallet/Basic/Transactions`
- gRPC`/wallet.Basic/Transactions` - gRPC`/wallet.Basic/Transactions`
- 白名单键:`wallet.Basic.Transactions`
- 请求示例: - 请求示例:
```json ```json
@@ -177,7 +169,6 @@
- 动态 HTTP`POST /rpc/wallet/Basic/AddBankCard` - 动态 HTTP`POST /rpc/wallet/Basic/AddBankCard`
- gRPC`/wallet.Basic/AddBankCard` - gRPC`/wallet.Basic/AddBankCard`
- 白名单键:`wallet.Basic.AddBankCard`
- 请求示例: - 请求示例:
```json ```json
@@ -194,7 +185,6 @@
- 动态 HTTP`POST /rpc/wallet/Basic/GetBankCard` - 动态 HTTP`POST /rpc/wallet/Basic/GetBankCard`
- gRPC`/wallet.Basic/GetBankCard` - gRPC`/wallet.Basic/GetBankCard`
- 白名单键:`wallet.Basic.GetBankCard`
- 请求示例: - 请求示例:
```json ```json
@@ -205,7 +195,6 @@
- 动态 HTTP`POST /rpc/wallet/Basic/RmBankCard` - 动态 HTTP`POST /rpc/wallet/Basic/RmBankCard`
- gRPC`/wallet.Basic/RmBankCard` - gRPC`/wallet.Basic/RmBankCard`
- 白名单键:`wallet.Basic.RmBankCard`
- 请求示例: - 请求示例:
```json ```json
@@ -218,7 +207,6 @@
- 动态 HTTP`POST /rpc/wallet/Basic/ApplyCash` - 动态 HTTP`POST /rpc/wallet/Basic/ApplyCash`
- gRPC`/wallet.Basic/ApplyCash` - gRPC`/wallet.Basic/ApplyCash`
- 白名单键:`wallet.Basic.ApplyCash`
- 请求示例: - 请求示例:
```json ```json
@@ -244,7 +232,6 @@
- 动态 HTTP`POST /rpc/wallet/Payment/Hello` - 动态 HTTP`POST /rpc/wallet/Payment/Hello`
- gRPC`/wallet.Payment/Hello` - gRPC`/wallet.Payment/Hello`
- 白名单键:`wallet.Payment.Hello`
- 请求示例: - 请求示例:
```json ```json
@@ -255,7 +242,6 @@
- 动态 HTTP`POST /rpc/wallet/Payment/Way` - 动态 HTTP`POST /rpc/wallet/Payment/Way`
- gRPC`/wallet.Payment/Way` - gRPC`/wallet.Payment/Way`
- 白名单键:`wallet.Payment.Way`
- 请求示例: - 请求示例:
```json ```json
@@ -268,7 +254,6 @@
- 动态 HTTP`POST /rpc/wallet/Payment/Get` - 动态 HTTP`POST /rpc/wallet/Payment/Get`
- gRPC`/wallet.Payment/Get` - gRPC`/wallet.Payment/Get`
- 白名单键:`wallet.Payment.Get`
- 请求示例: - 请求示例:
```json ```json
@@ -282,7 +267,6 @@
- 动态 HTTP`POST /rpc/wallet/Payment/ByOrder` - 动态 HTTP`POST /rpc/wallet/Payment/ByOrder`
- gRPC`/wallet.Payment/ByOrder` - gRPC`/wallet.Payment/ByOrder`
- 白名单键:`wallet.Payment.ByOrder`
- 请求示例: - 请求示例:
```json ```json
@@ -301,7 +285,6 @@
- 动态 HTTP`POST /rpc/wallet/Payment/ByCharge` - 动态 HTTP`POST /rpc/wallet/Payment/ByCharge`
- gRPC`/wallet.Payment/ByCharge` - gRPC`/wallet.Payment/ByCharge`
- 白名单键:`wallet.Payment.ByCharge`
- 请求示例: - 请求示例:
```json ```json
@@ -319,7 +302,6 @@
- 动态 HTTP`POST /rpc/wallet/Payment/Callback` - 动态 HTTP`POST /rpc/wallet/Payment/Callback`
- gRPC`/wallet.Payment/Callback` - gRPC`/wallet.Payment/Callback`
- 白名单键:`wallet.Payment.Callback`
- 请求示例: - 请求示例:
```json ```json
@@ -345,7 +327,6 @@
- 动态 HTTP`POST /rpc/wallet/Wechat/JsapiPreOrder` - 动态 HTTP`POST /rpc/wallet/Wechat/JsapiPreOrder`
- gRPC`/wallet.Wechat/JsapiPreOrder` - gRPC`/wallet.Wechat/JsapiPreOrder`
- 白名单键:`wallet.Wechat.JsapiPreOrder`
- 请求示例: - 请求示例:
```json ```json
@@ -363,7 +344,6 @@
- 动态 HTTP`POST /rpc/wallet/Wechat/AppPreOrder` - 动态 HTTP`POST /rpc/wallet/Wechat/AppPreOrder`
- gRPC`/wallet.Wechat/AppPreOrder` - gRPC`/wallet.Wechat/AppPreOrder`
- 白名单键:`wallet.Wechat.AppPreOrder`
- 请求示例: - 请求示例:
```json ```json
@@ -379,7 +359,6 @@
- 动态 HTTP`POST /rpc/wallet/Wechat/NativePreOrder` - 动态 HTTP`POST /rpc/wallet/Wechat/NativePreOrder`
- gRPC`/wallet.Wechat/NativePreOrder` - gRPC`/wallet.Wechat/NativePreOrder`
- 白名单键:`wallet.Wechat.NativePreOrder`
- 请求示例: - 请求示例:
```json ```json
@@ -395,7 +374,6 @@
- 动态 HTTP`POST /rpc/wallet/Wechat/Transfer` - 动态 HTTP`POST /rpc/wallet/Wechat/Transfer`
- gRPC`/wallet.Wechat/Transfer` - gRPC`/wallet.Wechat/Transfer`
- 白名单键:`wallet.Wechat.Transfer`
- 请求示例: - 请求示例:
```json ```json
@@ -412,7 +390,6 @@
- 动态 HTTP`POST /rpc/wallet/Wechat/WxCallback` - 动态 HTTP`POST /rpc/wallet/Wechat/WxCallback`
- gRPC`/wallet.Wechat/WxCallback` - gRPC`/wallet.Wechat/WxCallback`
- 白名单键:`wallet.Wechat.WxCallback`
- 请求示例: - 请求示例:
```json ```json

View File

@@ -9,7 +9,7 @@
- 动态 HTTP`POST /rpc/feed/{Service}/{Method}` - 动态 HTTP`POST /rpc/feed/{Service}/{Method}`
- 原生 gRPC`/feed.{Service}/{Method}` - 原生 gRPC`/feed.{Service}/{Method}`
- grpc-gateway`POST /feed.{Service}/{Method}` - grpc-gateway`POST /feed.{Service}/{Method}`
- 鉴权:需要登录的接口通过 `Authorization: Bearer <token>` 传递凭证 - 鉴权:需要登录的接口通过 `Authorization: <JWT>` 传递裸 JWT不添加 `Bearer` 前缀
- 动态 HTTP 成功或失败均返回 HTTP 200业务状态见 `code``message``details` - 动态 HTTP 成功或失败均返回 HTTP 200业务状态见 `code``message``details`
## 服务概览 ## 服务概览
@@ -38,7 +38,6 @@
- 动态 HTTP`POST /rpc/feed/Post/Fetch` - 动态 HTTP`POST /rpc/feed/Post/Fetch`
- gRPC`/feed.Post/Fetch` - gRPC`/feed.Post/Fetch`
- 白名单键:`feed.Post.Fetch`
- 请求示例: - 请求示例:
```json ```json
@@ -55,7 +54,6 @@
- 动态 HTTP`POST /rpc/feed/Post/Create` - 动态 HTTP`POST /rpc/feed/Post/Create`
- gRPC`/feed.Post/Create` - gRPC`/feed.Post/Create`
- 白名单键:`feed.Post.Create`
- 请求示例: - 请求示例:
```json ```json
@@ -88,7 +86,6 @@
- 动态 HTTP`POST /rpc/feed/Post/Change` - 动态 HTTP`POST /rpc/feed/Post/Change`
- gRPC`/feed.Post/Change` - gRPC`/feed.Post/Change`
- 白名单键:`feed.Post.Change`
- 请求示例: - 请求示例:
```json ```json
@@ -121,7 +118,6 @@
- 动态 HTTP`POST /rpc/feed/Post/Remove` - 动态 HTTP`POST /rpc/feed/Post/Remove`
- gRPC`/feed.Post/Remove` - gRPC`/feed.Post/Remove`
- 白名单键:`feed.Post.Remove`
- 请求示例: - 请求示例:
```json ```json
@@ -135,7 +131,6 @@
- 动态 HTTP`POST /rpc/feed/Post/CommentList` - 动态 HTTP`POST /rpc/feed/Post/CommentList`
- gRPC`/feed.Post/CommentList` - gRPC`/feed.Post/CommentList`
- 白名单键:`feed.Post.CommentList`
- 请求示例: - 请求示例:
```json ```json
@@ -152,7 +147,6 @@
- 动态 HTTP`POST /rpc/feed/Post/AddComment` - 动态 HTTP`POST /rpc/feed/Post/AddComment`
- gRPC`/feed.Post/AddComment` - gRPC`/feed.Post/AddComment`
- 白名单键:`feed.Post.AddComment`
- 请求示例: - 请求示例:
```json ```json
@@ -171,7 +165,6 @@
- 动态 HTTP`POST /rpc/feed/Post/DeleteComment` - 动态 HTTP`POST /rpc/feed/Post/DeleteComment`
- gRPC`/feed.Post/DeleteComment` - gRPC`/feed.Post/DeleteComment`
- 白名单键:`feed.Post.DeleteComment`
- 请求示例: - 请求示例:
```json ```json
@@ -185,7 +178,6 @@
- 动态 HTTP`POST /rpc/feed/Post/Action` - 动态 HTTP`POST /rpc/feed/Post/Action`
- gRPC`/feed.Post/Action` - gRPC`/feed.Post/Action`
- 白名单键:`feed.Post.Action`
- 请求示例: - 请求示例:
```json ```json
@@ -207,7 +199,6 @@
- 动态 HTTP`POST /rpc/feed/Setting/Info` - 动态 HTTP`POST /rpc/feed/Setting/Info`
- gRPC`/feed.Setting/Info` - gRPC`/feed.Setting/Info`
- 白名单键:`feed.Setting.Info`
- 请求示例: - 请求示例:
```json ```json
@@ -218,7 +209,6 @@
- 动态 HTTP`POST /rpc/feed/Setting/Rights` - 动态 HTTP`POST /rpc/feed/Setting/Rights`
- gRPC`/feed.Setting/Rights` - gRPC`/feed.Setting/Rights`
- 白名单键:`feed.Setting.Rights`
- 请求示例: - 请求示例:
```json ```json
@@ -237,7 +227,6 @@
- 动态 HTTP`POST /rpc/feed/Tag/List` - 动态 HTTP`POST /rpc/feed/Tag/List`
- gRPC`/feed.Tag/List` - gRPC`/feed.Tag/List`
- 白名单键:`feed.Tag.List`
- 请求示例: - 请求示例:
```json ```json
@@ -254,7 +243,6 @@
- 动态 HTTP`POST /rpc/feed/Tag/Create` - 动态 HTTP`POST /rpc/feed/Tag/Create`
- gRPC`/feed.Tag/Create` - gRPC`/feed.Tag/Create`
- 白名单键:`feed.Tag.Create`
- 请求示例: - 请求示例:
```json ```json
@@ -269,7 +257,6 @@
- 动态 HTTP`POST /rpc/feed/Tag/PostList` - 动态 HTTP`POST /rpc/feed/Tag/PostList`
- gRPC`/feed.Tag/PostList` - gRPC`/feed.Tag/PostList`
- 白名单键:`feed.Tag.PostList`
- 请求示例: - 请求示例:
```json ```json
@@ -295,7 +282,6 @@
- 动态 HTTP`POST /rpc/feed/Timeline/Recommend` - 动态 HTTP`POST /rpc/feed/Timeline/Recommend`
- gRPC`/feed.Timeline/Recommend` - gRPC`/feed.Timeline/Recommend`
- 白名单键:`feed.Timeline.Recommend`
- 请求示例: - 请求示例:
```json ```json
@@ -312,7 +298,6 @@
- 动态 HTTP`POST /rpc/feed/Timeline/Friend` - 动态 HTTP`POST /rpc/feed/Timeline/Friend`
- gRPC`/feed.Timeline/Friend` - gRPC`/feed.Timeline/Friend`
- 白名单键:`feed.Timeline.Friend`
- 请求示例: - 请求示例:
```json ```json
@@ -329,7 +314,6 @@
- 动态 HTTP`POST /rpc/feed/Timeline/Follow` - 动态 HTTP`POST /rpc/feed/Timeline/Follow`
- gRPC`/feed.Timeline/Follow` - gRPC`/feed.Timeline/Follow`
- 白名单键:`feed.Timeline.Follow`
- 请求示例: - 请求示例:
```json ```json
@@ -346,7 +330,6 @@
- 动态 HTTP`POST /rpc/feed/Timeline/Hot` - 动态 HTTP`POST /rpc/feed/Timeline/Hot`
- gRPC`/feed.Timeline/Hot` - gRPC`/feed.Timeline/Hot`
- 白名单键:`feed.Timeline.Hot`
- 请求示例: - 请求示例:
```json ```json

View File

@@ -9,7 +9,7 @@
- 动态 HTTP`POST /rpc/group/{Service}/{Method}` - 动态 HTTP`POST /rpc/group/{Service}/{Method}`
- 原生 gRPC`/group.{Service}/{Method}` - 原生 gRPC`/group.{Service}/{Method}`
- grpc-gateway`POST /group.{Service}/{Method}` - grpc-gateway`POST /group.{Service}/{Method}`
- 鉴权:需要登录的接口通过 `Authorization: Bearer <token>` 传递凭证 - 鉴权:需要登录的接口通过 `Authorization: <JWT>` 传递裸 JWT不添加 `Bearer` 前缀
- 动态 HTTP 成功或失败均返回 HTTP 200业务状态见 `code``message``details` - 动态 HTTP 成功或失败均返回 HTTP 200业务状态见 `code``message``details`
## 服务概览 ## 服务概览
@@ -34,7 +34,6 @@
- 动态 HTTP`POST /rpc/group/Basic/Search` - 动态 HTTP`POST /rpc/group/Basic/Search`
- gRPC`/group.Basic/Search` - gRPC`/group.Basic/Search`
- 白名单键:`group.Basic.Search`
- 请求示例: - 请求示例:
```json ```json
@@ -47,7 +46,6 @@
- 动态 HTTP`POST /rpc/group/Basic/Fetch` - 动态 HTTP`POST /rpc/group/Basic/Fetch`
- gRPC`/group.Basic/Fetch` - gRPC`/group.Basic/Fetch`
- 白名单键:`group.Basic.Fetch`
- 请求示例: - 请求示例:
```json ```json
@@ -58,7 +56,6 @@
- 动态 HTTP`POST /rpc/group/Basic/Get` - 动态 HTTP`POST /rpc/group/Basic/Get`
- gRPC`/group.Basic/Get` - gRPC`/group.Basic/Get`
- 白名单键:`group.Basic.Get`
- 请求示例: - 请求示例:
```json ```json
@@ -72,7 +69,6 @@
- 动态 HTTP`POST /rpc/group/Basic/Create` - 动态 HTTP`POST /rpc/group/Basic/Create`
- gRPC`/group.Basic/Create` - gRPC`/group.Basic/Create`
- 白名单键:`group.Basic.Create`
- 请求示例: - 请求示例:
```json ```json
@@ -105,7 +101,6 @@
- 动态 HTTP`POST /rpc/group/Basic/Modify` - 动态 HTTP`POST /rpc/group/Basic/Modify`
- gRPC`/group.Basic/Modify` - gRPC`/group.Basic/Modify`
- 白名单键:`group.Basic.Modify`
- 请求示例: - 请求示例:
```json ```json
@@ -138,7 +133,6 @@
- 动态 HTTP`POST /rpc/group/Basic/Disband` - 动态 HTTP`POST /rpc/group/Basic/Disband`
- gRPC`/group.Basic/Disband` - gRPC`/group.Basic/Disband`
- 白名单键:`group.Basic.Disband`
- 请求示例: - 请求示例:
```json ```json
@@ -164,7 +158,6 @@
- 动态 HTTP`POST /rpc/group/Member/Fetch` - 动态 HTTP`POST /rpc/group/Member/Fetch`
- gRPC`/group.Member/Fetch` - gRPC`/group.Member/Fetch`
- 白名单键:`group.Member.Fetch`
- 请求示例: - 请求示例:
```json ```json
@@ -178,7 +171,6 @@
- 动态 HTTP`POST /rpc/group/Member/DoJoin` - 动态 HTTP`POST /rpc/group/Member/DoJoin`
- gRPC`/group.Member/DoJoin` - gRPC`/group.Member/DoJoin`
- 白名单键:`group.Member.DoJoin`
- 请求示例: - 请求示例:
```json ```json
@@ -193,7 +185,6 @@
- 动态 HTTP`POST /rpc/group/Member/JoinFetch` - 动态 HTTP`POST /rpc/group/Member/JoinFetch`
- gRPC`/group.Member/JoinFetch` - gRPC`/group.Member/JoinFetch`
- 白名单键:`group.Member.JoinFetch`
- 请求示例: - 请求示例:
```json ```json
@@ -204,7 +195,6 @@
- 动态 HTTP`POST /rpc/group/Member/JoinDoHandle` - 动态 HTTP`POST /rpc/group/Member/JoinDoHandle`
- gRPC`/group.Member/JoinDoHandle` - gRPC`/group.Member/JoinDoHandle`
- 白名单键:`group.Member.JoinDoHandle`
- 请求示例: - 请求示例:
```json ```json
@@ -219,7 +209,6 @@
- 动态 HTTP`POST /rpc/group/Member/DoSetManager` - 动态 HTTP`POST /rpc/group/Member/DoSetManager`
- gRPC`/group.Member/DoSetManager` - gRPC`/group.Member/DoSetManager`
- 白名单键:`group.Member.DoSetManager`
- 请求示例: - 请求示例:
```json ```json
@@ -234,7 +223,6 @@
- 动态 HTTP`POST /rpc/group/Member/DoKick` - 动态 HTTP`POST /rpc/group/Member/DoKick`
- gRPC`/group.Member/DoKick` - gRPC`/group.Member/DoKick`
- 白名单键:`group.Member.DoKick`
- 请求示例: - 请求示例:
```json ```json
@@ -249,7 +237,6 @@
- 动态 HTTP`POST /rpc/group/Member/DoQuit` - 动态 HTTP`POST /rpc/group/Member/DoQuit`
- gRPC`/group.Member/DoQuit` - gRPC`/group.Member/DoQuit`
- 白名单键:`group.Member.DoQuit`
- 请求示例: - 请求示例:
```json ```json

View File

@@ -9,7 +9,7 @@
- 动态 HTTP`POST /rpc/relation/{Service}/{Method}` - 动态 HTTP`POST /rpc/relation/{Service}/{Method}`
- 原生 gRPC`/relation.{Service}/{Method}` - 原生 gRPC`/relation.{Service}/{Method}`
- grpc-gateway`POST /relation.{Service}/{Method}` - grpc-gateway`POST /relation.{Service}/{Method}`
- 鉴权:需要登录的接口通过 `Authorization: Bearer <token>` 传递凭证 - 鉴权:需要登录的接口通过 `Authorization: <JWT>` 传递裸 JWT不添加 `Bearer` 前缀
- 动态 HTTP 成功或失败均返回 HTTP 200业务状态见 `code``message``details` - 动态 HTTP 成功或失败均返回 HTTP 200业务状态见 `code``message``details`
## 服务概览 ## 服务概览
@@ -33,7 +33,6 @@
- 动态 HTTP`POST /rpc/relation/Follow/Doing` - 动态 HTTP`POST /rpc/relation/Follow/Doing`
- gRPC`/relation.Follow/Doing` - gRPC`/relation.Follow/Doing`
- 白名单键:`relation.Follow.Doing`
- 请求示例: - 请求示例:
```json ```json
@@ -47,7 +46,6 @@
- 动态 HTTP`POST /rpc/relation/Follow/Undo` - 动态 HTTP`POST /rpc/relation/Follow/Undo`
- gRPC`/relation.Follow/Undo` - gRPC`/relation.Follow/Undo`
- 白名单键:`relation.Follow.Undo`
- 请求示例: - 请求示例:
```json ```json
@@ -61,7 +59,6 @@
- 动态 HTTP`POST /rpc/relation/Follow/State` - 动态 HTTP`POST /rpc/relation/Follow/State`
- gRPC`/relation.Follow/State` - gRPC`/relation.Follow/State`
- 白名单键:`relation.Follow.State`
- 请求示例: - 请求示例:
```json ```json
@@ -75,7 +72,6 @@
- 动态 HTTP`POST /rpc/relation/Follow/Fetch` - 动态 HTTP`POST /rpc/relation/Follow/Fetch`
- gRPC`/relation.Follow/Fetch` - gRPC`/relation.Follow/Fetch`
- 白名单键:`relation.Follow.Fetch`
- 请求示例: - 请求示例:
```json ```json
@@ -114,7 +110,6 @@
- 动态 HTTP`POST /rpc/relation/Friend/Search` - 动态 HTTP`POST /rpc/relation/Friend/Search`
- gRPC`/relation.Friend/Search` - gRPC`/relation.Friend/Search`
- 白名单键:`relation.Friend.Search`
- 请求示例: - 请求示例:
```json ```json
@@ -127,7 +122,6 @@
- 动态 HTTP`POST /rpc/relation/Friend/Fetch` - 动态 HTTP`POST /rpc/relation/Friend/Fetch`
- gRPC`/relation.Friend/Fetch` - gRPC`/relation.Friend/Fetch`
- 白名单键:`relation.Friend.Fetch`
- 请求示例: - 请求示例:
```json ```json
@@ -140,7 +134,6 @@
- 动态 HTTP`POST /rpc/relation/Friend/Get` - 动态 HTTP`POST /rpc/relation/Friend/Get`
- gRPC`/relation.Friend/Get` - gRPC`/relation.Friend/Get`
- 白名单键:`relation.Friend.Get`
- 请求示例: - 请求示例:
```json ```json
@@ -154,7 +147,6 @@
- 动态 HTTP`POST /rpc/relation/Friend/ModifyNickname` - 动态 HTTP`POST /rpc/relation/Friend/ModifyNickname`
- gRPC`/relation.Friend/ModifyNickname` - gRPC`/relation.Friend/ModifyNickname`
- 白名单键:`relation.Friend.ModifyNickname`
- 请求示例: - 请求示例:
```json ```json
@@ -168,7 +160,6 @@
- 动态 HTTP`POST /rpc/relation/Friend/DoPopular` - 动态 HTTP`POST /rpc/relation/Friend/DoPopular`
- gRPC`/relation.Friend/DoPopular` - gRPC`/relation.Friend/DoPopular`
- 白名单键:`relation.Friend.DoPopular`
- 请求示例: - 请求示例:
```json ```json
@@ -182,7 +173,6 @@
- 动态 HTTP`POST /rpc/relation/Friend/UndoPopular` - 动态 HTTP`POST /rpc/relation/Friend/UndoPopular`
- gRPC`/relation.Friend/UndoPopular` - gRPC`/relation.Friend/UndoPopular`
- 白名单键:`relation.Friend.UndoPopular`
- 请求示例: - 请求示例:
```json ```json
@@ -196,7 +186,6 @@
- 动态 HTTP`POST /rpc/relation/Friend/Delete` - 动态 HTTP`POST /rpc/relation/Friend/Delete`
- gRPC`/relation.Friend/Delete` - gRPC`/relation.Friend/Delete`
- 白名单键:`relation.Friend.Delete`
- 请求示例: - 请求示例:
```json ```json
@@ -210,7 +199,6 @@
- 动态 HTTP`POST /rpc/relation/Friend/ApplyFetch` - 动态 HTTP`POST /rpc/relation/Friend/ApplyFetch`
- gRPC`/relation.Friend/ApplyFetch` - gRPC`/relation.Friend/ApplyFetch`
- 白名单键:`relation.Friend.ApplyFetch`
- 请求示例: - 请求示例:
```json ```json
@@ -223,7 +211,6 @@
- 动态 HTTP`POST /rpc/relation/Friend/ApplyGet` - 动态 HTTP`POST /rpc/relation/Friend/ApplyGet`
- gRPC`/relation.Friend/ApplyGet` - gRPC`/relation.Friend/ApplyGet`
- 白名单键:`relation.Friend.ApplyGet`
- 请求示例: - 请求示例:
```json ```json
@@ -237,7 +224,6 @@
- 动态 HTTP`POST /rpc/relation/Friend/ApplyDo` - 动态 HTTP`POST /rpc/relation/Friend/ApplyDo`
- gRPC`/relation.Friend/ApplyDo` - gRPC`/relation.Friend/ApplyDo`
- 白名单键:`relation.Friend.ApplyDo`
- 请求示例: - 请求示例:
```json ```json
@@ -252,7 +238,6 @@
- 动态 HTTP`POST /rpc/relation/Friend/ApplyDoMessage` - 动态 HTTP`POST /rpc/relation/Friend/ApplyDoMessage`
- gRPC`/relation.Friend/ApplyDoMessage` - gRPC`/relation.Friend/ApplyDoMessage`
- 白名单键:`relation.Friend.ApplyDoMessage`
- 请求示例: - 请求示例:
```json ```json
@@ -266,7 +251,6 @@
- 动态 HTTP`POST /rpc/relation/Friend/ApplyDoPass` - 动态 HTTP`POST /rpc/relation/Friend/ApplyDoPass`
- gRPC`/relation.Friend/ApplyDoPass` - gRPC`/relation.Friend/ApplyDoPass`
- 白名单键:`relation.Friend.ApplyDoPass`
- 请求示例: - 请求示例:
```json ```json
@@ -281,7 +265,6 @@
- 动态 HTTP`POST /rpc/relation/Friend/ApplyDoReject` - 动态 HTTP`POST /rpc/relation/Friend/ApplyDoReject`
- gRPC`/relation.Friend/ApplyDoReject` - gRPC`/relation.Friend/ApplyDoReject`
- 白名单键:`relation.Friend.ApplyDoReject`
- 请求示例: - 请求示例:
```json ```json
@@ -295,7 +278,6 @@
- 动态 HTTP`POST /rpc/relation/Friend/TagFetch` - 动态 HTTP`POST /rpc/relation/Friend/TagFetch`
- gRPC`/relation.Friend/TagFetch` - gRPC`/relation.Friend/TagFetch`
- 白名单键:`relation.Friend.TagFetch`
- 请求示例: - 请求示例:
```json ```json
@@ -306,7 +288,6 @@
- 动态 HTTP`POST /rpc/relation/Friend/TagMemberFetch` - 动态 HTTP`POST /rpc/relation/Friend/TagMemberFetch`
- gRPC`/relation.Friend/TagMemberFetch` - gRPC`/relation.Friend/TagMemberFetch`
- 白名单键:`relation.Friend.TagMemberFetch`
- 请求示例: - 请求示例:
```json ```json
@@ -320,7 +301,6 @@
- 动态 HTTP`POST /rpc/relation/Friend/TagDoCreate` - 动态 HTTP`POST /rpc/relation/Friend/TagDoCreate`
- gRPC`/relation.Friend/TagDoCreate` - gRPC`/relation.Friend/TagDoCreate`
- 白名单键:`relation.Friend.TagDoCreate`
- 请求示例: - 请求示例:
```json ```json
@@ -336,7 +316,6 @@
- 动态 HTTP`POST /rpc/relation/Friend/TagDoUpdate` - 动态 HTTP`POST /rpc/relation/Friend/TagDoUpdate`
- gRPC`/relation.Friend/TagDoUpdate` - gRPC`/relation.Friend/TagDoUpdate`
- 白名单键:`relation.Friend.TagDoUpdate`
- 请求示例: - 请求示例:
```json ```json
@@ -360,7 +339,6 @@
- 动态 HTTP`POST /rpc/relation/Match/Fetch` - 动态 HTTP`POST /rpc/relation/Match/Fetch`
- gRPC`/relation.Match/Fetch` - gRPC`/relation.Match/Fetch`
- 白名单键:`relation.Match.Fetch`
- 请求示例: - 请求示例:
```json ```json
@@ -377,7 +355,6 @@
- 动态 HTTP`POST /rpc/relation/Match/Get` - 动态 HTTP`POST /rpc/relation/Match/Get`
- gRPC`/relation.Match/Get` - gRPC`/relation.Match/Get`
- 白名单键:`relation.Match.Get`
- 请求示例: - 请求示例:
```json ```json
@@ -391,7 +368,6 @@
- 动态 HTTP`POST /rpc/relation/Match/DoJoin` - 动态 HTTP`POST /rpc/relation/Match/DoJoin`
- gRPC`/relation.Match/DoJoin` - gRPC`/relation.Match/DoJoin`
- 白名单键:`relation.Match.DoJoin`
- 请求示例: - 请求示例:
```json ```json
@@ -405,7 +381,6 @@
- 动态 HTTP`POST /rpc/relation/Match/DoIgnore` - 动态 HTTP`POST /rpc/relation/Match/DoIgnore`
- gRPC`/relation.Match/DoIgnore` - gRPC`/relation.Match/DoIgnore`
- 白名单键:`relation.Match.DoIgnore`
- 请求示例: - 请求示例:
```json ```json

View File

@@ -8,13 +8,13 @@
|---|---|---|---|---| |---|---|---|---|---|
| GET | `/rest/fts/ping` | 否 | 无 | 健康检查,返回 Pong | | GET | `/rest/fts/ping` | 否 | 无 | 健康检查,返回 Pong |
| GET | `/rest/fts/config` | 否 | 无 | 获取上传字段、大小和扩展名限制 | | GET | `/rest/fts/config` | 否 | 无 | 获取上传字段、大小和扩展名限制 |
| POST | `/rest/fts/uploader` | Bearer Token | `multipart/form-data` | 上传文件到 local 或 MinIO | | POST | `/rest/fts/uploader` | JWT | `multipart/form-data` | 上传文件到 local 或 MinIO |
## 上传文件 ## 上传文件
```http ```http
POST /rest/fts/uploader POST /rest/fts/uploader
Authorization: Bearer <token> Authorization: <JWT>
Content-Type: multipart/form-data Content-Type: multipart/form-data
``` ```

View File

@@ -1,6 +1,6 @@
# MGT REST API # MGT REST API
后台用户、应用、角色、权限和部门管理。基础路径:`/rest/mgt`。除匿名接口外均需 Bearer Token;标记“管理员”的路由还会执行管理员权限检查。 后台用户、应用、角色、权限和部门管理。基础路径:`/rest/mgt`。除匿名接口外均需`Authorization` 头直接携带 JWT不加 `Bearer`;标记“管理员”的路由还会执行管理员权限检查。
## 匿名接口 ## 匿名接口
@@ -129,4 +129,3 @@
## 通用响应 ## 通用响应
接口使用 SDK 统一响应包装,常见数据结构包括:登录 `LoginResp`、分页 `{total,data,page,size}`、创建 `{id,identity}`。客户端必须同时判断 HTTP 状态和响应中的业务 code。 接口使用 SDK 统一响应包装,常见数据结构包括:登录 `LoginResp`、分页 `{total,data,page,size}`、创建 `{id,identity}`。客户端必须同时判断 HTTP 状态和响应中的业务 code。