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

网站前台用什么做北京网站建设推广服务信息

网站前台用什么做,北京网站建设推广服务信息,网站有了备案号之后能做什么,深圳百度推广优化这次只是实现应用的curd和公私钥的校验以及第三方的通知dmeo项目,大家可以拓开视野来编写 进入主题 项目链接:桌角的眼镜/develop_auth_platform 直接下拉并运行就行 回调应用代码在test包中 回调应用测试代码 package mainimport ("encoding/…

这次只是实现应用的curd和公私钥的校验以及第三方的通知dmeo项目,大家可以拓开视野来编写

进入主题

项目链接:桌角的眼镜/develop_auth_platform

直接下拉并运行就行 回调应用代码在test包中

回调应用测试代码

package mainimport ("encoding/json""fmt""io""log""net/http""time"
)func main() {// 设置路由http.HandleFunc("/callback", callbackHandler)http.HandleFunc("/", homeHandler)// 配置服务器server := &http.Server{Addr:         ":8089",ReadTimeout:  5 * time.Second,WriteTimeout: 10 * time.Second,}// 启动服务器fmt.Printf("🚀 服务已启动,监听端口 8089\n")fmt.Printf("👉 测试接口: curl -X POST http://localhost:8089/callback -d '{\"message\":\"test\"}'\n")if err := server.ListenAndServe(); err != nil {log.Fatalf("❌ 服务器启动失败: %v", err)}
}// 回调接口处理器
func callbackHandler(w http.ResponseWriter, r *http.Request) {// 打印请求基本信息fmt.Printf("\n=== 收到回调请求 ===\n")fmt.Printf("时间: %s\n", time.Now().Format(time.RFC3339))fmt.Printf("方法: %s\n", r.Method)fmt.Printf("来源IP: %s\n", r.RemoteAddr)fmt.Printf("请求头: %v\n", r.Header)// 根据Content-Type处理不同格式的请求体contentType := r.Header.Get("Content-Type")var body interface{}switch contentType {case "application/json":var jsonBody map[string]interface{}if err := json.NewDecoder(r.Body).Decode(&jsonBody); err != nil {http.Error(w, "无效的JSON数据", http.StatusBadRequest)return}body = jsonBodydefault:// 其他类型直接读取原始数据data, err := io.ReadAll(r.Body)if err != nil {http.Error(w, "读取请求体失败", http.StatusBadRequest)return}body = string(data)}// 打印请求体fmt.Printf("请求体: %+v\n", body)fmt.Printf("===================\n")// 返回成功响应w.Header().Set("Content-Type", "application/json")json.NewEncoder(w).Encode(map[string]interface{}{"status":  "success","message": "回调已接收","data":    body,})
}// 首页处理器
func homeHandler(w http.ResponseWriter, r *http.Request) {if r.URL.Path != "/" {http.NotFound(w, r)return}w.Header().Set("Content-Type", "text/plain")fmt.Fprintf(w, "回调服务运行中\n请访问 /callback 接口")
}

 项目的简易结构

核心部分 

Application的curd

/api/v1/下的application.go

package v1import ("github.com/gin-gonic/gin""github.com/spectacleCase/develop_auth_platform/global""github.com/spectacleCase/develop_auth_platform/models"request "github.com/spectacleCase/develop_auth_platform/models/request"
)type Application struct{}func (Application) Create() gin.HandlerFunc {return func(c *gin.Context) {var NewApp request.Createif err := c.ShouldBind(&NewApp); err != nil {models.FailWithMessage("参数有误", c)return}id, err := models.GenerateID()if err != nil {models.FailWithMessage(err.Error(), c)return}// 得到公私钥prKey, puKey, err := models.GetDefaultKeyPair()if err != nil {models.FailWithMessage(err.Error(), c)return}global.ApplicationList = append(global.ApplicationList, &models.Application{Id:          id,Name:        NewApp.Name,CallbackUrl: NewApp.CallbackUrl,PrKey:       prKey,PuKey:       puKey,})models.Ok(c)return}
}func (Application) Get() gin.HandlerFunc {return func(c *gin.Context) {models.OkWithData(global.ApplicationList, c)return}
}func (Application) Update() gin.HandlerFunc {return func(c *gin.Context) {var updateApp request.Updateif err := c.ShouldBind(&updateApp); err != nil {models.FailWithMessage("参数有误", c)return}for index, app := range global.ApplicationList {if app == nil {continue // 跳过 nil 指针}if app.Id == updateApp.Id {app.Name = updateApp.Nameapp.CallbackUrl = updateApp.CallbackUrlglobal.ApplicationList[index] = app}models.Ok(c)return}models.FailWithMessage("错误的参数", c)return}
}func (Application) Delete() gin.HandlerFunc {return func(c *gin.Context) {var delApp request.Deleteif err := c.ShouldBind(&delApp); err != nil {models.FailWithMessage("参数有误", c)return}for index, app := range global.ApplicationList {if app == nil {continue // 跳过 nil 指针}if app.Id == delApp.Id {global.ApplicationList[index] = nil}models.Ok(c)return}models.FailWithMessage("错误的参数", c)return}
}

/models下的application.go 

package modelsimport ("crypto/rand""crypto/rsa""crypto/x509""encoding/base64""encoding/pem""fmt"
)type Application struct {Id          string `json:"id"`Name        string `json:"name"`PrKey       string `json:"-"`     // 私钥(JSON 序列化时忽略)PuKey       string `json:"puKey"` // 公钥SerPuKey    string `json:"serPuKey"`CallbackUrl string `json:"callbackUrl"` // 回调地址
}// GenerateID 生成唯一应用ID (UUID简化版)
func GenerateID() (string, error) {const length = 16 // 16字节 = 128位b := make([]byte, length)if _, err := rand.Read(b); err != nil {return "", fmt.Errorf("生成ID失败: %v", err)}return base64.URLEncoding.EncodeToString(b), nil
}// GenerateKeyPair 生成RSA公私钥对
func GenerateKeyPair(bits int) (prKey, puKey string, err error) {privateKey, err := rsa.GenerateKey(rand.Reader, bits)if err != nil {return "", "", fmt.Errorf("密钥生成失败: %v", err)}// 编码私钥privateKeyBytes := x509.MarshalPKCS1PrivateKey(privateKey)privateKeyPEM := pem.EncodeToMemory(&pem.Block{Type:  "RSA PRIVATE KEY",Bytes: privateKeyBytes,})// 编码公钥publicKeyBytes, err := x509.MarshalPKIXPublicKey(&privateKey.PublicKey)if err != nil {return "", "", fmt.Errorf("公钥编码失败: %v", err)}publicKeyPEM := pem.EncodeToMemory(&pem.Block{Type:  "PUBLIC KEY",Bytes: publicKeyBytes,})return string(privateKeyPEM), string(publicKeyPEM), nil
}// GetDefaultKeyPair 获取默认强度的密钥对 (2048位)
func GetDefaultKeyPair() (string, string, error) {return GenerateKeyPair(2048)
}// VerifyKeyPair 验证公私钥是否匹配
func VerifyKeyPair(prKey, puKey string) bool {block, _ := pem.Decode([]byte(prKey))if block == nil {return false}privateKey, err := x509.ParsePKCS1PrivateKey(block.Bytes)if err != nil {return false}pubBlock, _ := pem.Decode([]byte(puKey))if pubBlock == nil {return false}pubKey, err := x509.ParsePKIXPublicKey(pubBlock.Bytes)if err != nil {return false}rsaPubKey, ok := pubKey.(*rsa.PublicKey)if !ok {return false}return privateKey.PublicKey.Equal(rsaPubKey)
}

测试截图

 


文章转载自:

http://OzE1aPVo.bzcpg.cn
http://iv9DDEGv.bzcpg.cn
http://dLrBJDPo.bzcpg.cn
http://R3XvfWGK.bzcpg.cn
http://A3M2Me6H.bzcpg.cn
http://vRpJVGfS.bzcpg.cn
http://THoj1nw4.bzcpg.cn
http://OHTrzQ2v.bzcpg.cn
http://kmbiw9nD.bzcpg.cn
http://SDJb52Wf.bzcpg.cn
http://FMsdZDFL.bzcpg.cn
http://LzgKuUIO.bzcpg.cn
http://5fCDpq6V.bzcpg.cn
http://IoYGDGcf.bzcpg.cn
http://ZNfWR34k.bzcpg.cn
http://0LUoVbAg.bzcpg.cn
http://QH46UR28.bzcpg.cn
http://2VIx0qeD.bzcpg.cn
http://bqRX2FWk.bzcpg.cn
http://M3SGKQjx.bzcpg.cn
http://noUQkOqL.bzcpg.cn
http://77fSPLvw.bzcpg.cn
http://Nwom5WWc.bzcpg.cn
http://PcSAC4DU.bzcpg.cn
http://gy0PxO9T.bzcpg.cn
http://CLzYzyKW.bzcpg.cn
http://o4kLCC1K.bzcpg.cn
http://iQf1XstA.bzcpg.cn
http://6giJeXrz.bzcpg.cn
http://gebhQfQK.bzcpg.cn
http://www.dtcms.com/wzjs/629326.html

相关文章:

  • 织梦如何做几种语言的网站高效的网站建设
  • 成都网站制作方案汝州网站建设汝州
  • 微信商城与网站一体门户网站界面设计模板下载
  • 宁波网站关键词排名提升辽宁省建设厅网站
  • 一些js特效的网站推荐安徽省城乡和住房建设厅网站
  • 免费做网站软件下载青岛推广软件
  • 网站网站建设专业建筑人才网筑才网
  • 哈尔滨建站模板商业网站的相关内容
  • 网站集群建设方案怎么创建小程序商店
  • 评论凡科网站建设怎么样南京网站设计哪家公司好
  • 太原注册公司在哪个网站申请wordpress添加视频解析
  • 维护网站是什么意思网站开发培训价格
  • 网络公司经营范围网站建设擼擼擼做最好的导航网站
  • 阿克苏网站建设福彩网网站建设方案
  • 中国企业500强公司排名单页网站seo怎么做
  • 鄞州区住房和城乡建设局网站南昌网站设计企业
  • 零陵网站建设wordpress用户个人资料
  • 微信网站怎么做下载附件物流软件开发工具
  • 建设营销型网站流程图国家机构网站建设
  • 海南网站建设案例织梦cms一键更新网站无法使用
  • 电子商务网站建设财务预算网站被黑 原因
  • 企业门户网站建设机构学院网站建设项目概述
  • 网站制作比较好的制作公司网站制作定制18
  • 云南昆明网站建设怎样找回网站备案密码
  • 郑州网站建设贝斯特wordpress手机版主题下载
  • 爱旅游网站制作制作手机app用什么语言
  • 做网站编程要学什么wordpress文字主题
  • 网站建设培训机构哪里好开购物网站需要多少钱
  • 做网站费用分几块做的比较好的企业网站
  • 哪些网站专门做康复科租电信网站服务器吗