iris二开onlyoffice

iris生成token并处理回调

      上一篇跟大家分享了docker如何部署onlyoffice并开启jwt,今天跟大家分享iris如何生成前端需要的token以及处理onlyoffice回调。

      一、生成token

      我们先新建一个生成token的方法,可以外部调用,包名命名为onlyoffice,代码如下

package onlyoffice

import (
   "errors"
   "encoding/json"
   jwt "github.com/golang-jwt/jwt/v4"
   "aiblog/config"
)

/**
onlyoffice
 */

// 生成token
func OnlyofficeCreateToken(payload string) (string, error) {
   // 获取配置
   secret := config.Instance.Onlyoffice.JwtSecret
   // 将原始字符串作为MapClaims负载
   var claims jwt.MapClaims
   if err := json.Unmarshal([]byte(payload), &claims); err != nil {
      return "", errors.New("could not parse JSON payload")
   }

   // 创建JWT签名方法
   token := jwt.NewWithClaims(jwt.SigningMethodHS256, claims)

   // 使用密钥签署JWT
   ss, err := token.SignedString([]byte(secret))
   if err != nil {
      return "", errors.New("could not generate a new jwt")
   }
    // 返回
   return ss, nil
}

      然后我们直接在控制器写一个方法,将用户传过来的config生成token,代码如下

type OnlyofficeController struct {
   Ctx iris.Context
}

type tokenResponse struct {
   Token string `json:"token"`
}

/**
生成token
 */
func (c *OnlyofficeController) PostCreateToken() *web.JsonResult {
   // 获取配置
   config := params.FormValue(c.Ctx, "config")
   if config == "" {
      return web.JsonErrorMsg("请输入配置")
   }
   // 获取token
   token, err := onlyoffice.OnlyofficeCreateToken(config)
   if err != nil {
      return web.JsonErrorMsg("创建失败")
   }
   //返回
   return web.JsonData(&tokenResponse{token})
}

我们将前端传过来的config生成token之后,再通过token返回给前端,这里的config内容就是前端请求onlyoffice的配置参数。

      二、处理回调

      我们回调需要返回{"error": 0},不然在onlyoffice编辑的时候会提示这个报错

The document could not be saved. Please check connection settings or contact 
your administrator.

下面直接贴出代码

/**
回调函数
 */
func (c *OnlyofficeController) PostCallBack() {
   //打印接受内容
   body, err := io.ReadAll(c.Ctx.Request().Body)
   if err != nil {
      logrus.Error("Onlyoffice通知参数错误:", err)
      c.Ctx.JSON(iris.Map{"error": 1, "message": "获取参数失败"})
      return
   }
   //记录数据
   logrus.Info("Onlyoffice通知参数:", string(body))
   //初始化结构体
   var onlyOfficeResult onlyoffice.OnlyOffice
   // 解析 JSON 数据到结构体
   err = json.Unmarshal(body, &onlyOfficeResult)
   if err != nil {
      c.Ctx.JSON(iris.Map{"error": 1, "message": "转化结构失败"})
      return
   }
   // 判断是否是编辑完成的
   if onlyOfficeResult.Status != 2 {
      c.Ctx.JSON(iris.Map{"error": 0, "message": "未编辑完成,不处理"})
      return
   }
   // 判断是否存在标识
   if onlyOfficeResult.Key == "" {
      c.Ctx.JSON(iris.Map{"error": 1, "message": "标识不存在,不处理"})
      return
   }
   // 判断是否存在链接
   if onlyOfficeResult.URL == "" {
      c.Ctx.JSON(iris.Map{"error": 1, "message": "链接不存在,不处理"})
      return
   }
   //保存修改后文件
   //这里填写自己处理的逻辑
   //返回
   c.Ctx.JSON(iris.Map{"error": 0})
}

上面我只是贴出接收跟返回的代码,中间的处理逻辑代码我是没放出来,大家根据自己的实际需求进行开发。


0条评论

发表评论