golang開發支持onlyoffice的token功能

一直都沒去弄token這塊,想著反正docker run的時候將jwt置為false即可。

看了好多文章,感覺可以試試,但是所有文件幾乎都沒說思路。

根據我的理解和成功的調試,思路是:

我們先定義2個概念,一個是文檔下載管理服務,一個是onlyoffice協作服務。

用戶點擊鏈接進入協作頁面,那么文檔下載服務那邊會根據這個鏈接里帶的文檔id,以及用戶的id,把一些變量傳給協作頁面里,例如用戶是否有權限編輯,還是只能看……還有文檔的下載地址,文檔類型等,這些參數,onlyoffice協作服務會在頁面取過去。

打開頁面后,頁面里的上述變量也填充了,頁面里再弄個JavaScript執行一段代碼,將上述填充了參數的json結構體,JSON.stringfy后,推薦用body方式傳到文檔下載服務那邊,文檔下載服務再解析,然后作為荷載生成token,返回給協作頁面里,協作頁面里取到token后,賦值給頁面某個元素即可。

當最后一個用戶關閉協作頁面9s后,onlyoffice協作服務器會發一段信息給文檔下載服務器那邊,文檔下載服務器收到信息,是不是token格式,是不是要解碼?敬請期待。

當然,token的secret一方面在文檔下載服務端用到,同時要加到docker啟動的onlyoffice容器中叫local.json里去。這個網上很多。

以上就是思路,很少有人講,或許大家都認為容易懂吧。

前端代碼參考:

const config = {"document": {"fileType": "{{.fileType}}","key": "{{.Key}}", //"Khirz6zTPdfd7""title": "{{.Doc.FileName}}","url":"http:\/\/192.168.100.37/attachment/onlyoffice/測試v3.docx"// "url": "{{.Engineercmsapi_url}}/attachment/onlyoffice/{{.Doc.FileName}}?hotqinsessionid={{.Sessionid}}",},"documentType": "{{.documentType}}","editorConfig": {"callbackUrl": "{{.Engineercmsapi_url}}/url-to-callback?id={{.Doc.Id}}","customization": {"uiTheme": "theme-dark","unit": "cm","wordHeadingsColor": "#00ff00","zoom": 100,},"user": {"id": {{.Uid }},"name": "{{.Username}}"},"lang": "zh-CN", //"en-US","mode": {{.Mode }}, //"view",//edit"region": "zh-CN",},"height": "100%","type": {{.Type }}, //"desktop",embedded,mobile訪問文檔的平臺類型 網頁嵌入"width": "100%"}// window.docEditor = new DocsAPI.DocEditor("placeholder", config);$(function () {const configJsonStr = JSON.stringify(config);$.ajax({type: "POST",url: "/v1/onlyoffice/jwtencode",contentType: "application/json",data: configJsonStr,dataType: "json",success: function (data) {console.log("成功")console.log(data)if(data.jwt){config.token = data.jwt;}  var docEditor = new DocsAPI.DocEditor("placeholder", config);},error: function (err) {console.error(err);}})})

golang服務端代碼參考

// *************官方給的生成tokend的代碼****開始*****冰山一角*****
// ***它只是告訴了我們,它用的是jwt.SigningMethodHS256
type onlyofficeJwtManager struct {key []byte
}func (j onlyofficeJwtManager) Sign(payload interface {Valid() error
}) (string, error) {token := jwt.NewWithClaims(jwt.SigningMethodHS256, payload)ss, err := token.SignedString(j.key)if err != nil {return "", errors.New("could not generate a new jwt")}return ss, nil
}
// *************官方給的生成tokend的代碼***結束******離補齊似乎相差十萬八千里********// ******我補的代碼***********type OnlyofficeClaims struct {Document             OnlyDocument     `json:"document"`DocumentType         string           `json:"documentType"`EditorConfig         OnlyEditorConfig `json:"editorConfig"`Height               string           `json:"height"`Type                 string           `json:"type"`Width                string           `json:"width"`jwt.RegisteredClaims                  // 只要結構體里放上這個就算是inteface{},并且符合作為claims的要求了。
}type OnlyDocument struct {FileType string `json:"fileType"`Key      string `json:"key"`Title    string `json:"title"`Url      string `json:"url"`
}type OnlyEditorConfig struct {CallbackUrl   string     `json:"callbackUrl"`Customization OnlyCustom `json:"customization"`User          OnlyUser   `json:"user"`Lang          string     `json:"lang"`Mode          string     `json:"mode"`Region        string     `json:"region"`
}type OnlyCustom struct {UiTheme           string `json:"uiTheme"`Unit              string `json:"unit"`WordHeadingsColor string `json:"wordHeadingsColor"`Zoom              int    `json:"zoom"`
}type OnlyUser struct {Id   string `json:"id"`Name string `json:"name"`
}// @Title post onlyoffce jwtencode token
// @Description post onlyoffice jwtencode token
// @Success 200 {object} models.Ollyoffice
// @Failure 400 Invalid page supplied
// @Failure 404 office not found
// @router /jwtencode [post]
// 生成token
func (c *OnlyController) JwtEncode() {content := c.Ctx.Input.RequestBodyvar onlyofficeconfig OnlyofficeClaimserr := json.Unmarshal(content, &onlyofficeconfig)if err != nil {logs.Error(err)}logs.Info(onlyofficeconfig) // {"document":{"fileType":"doc","key":"1558683150313208200","title":"xml.doc","url":"http://192.168.100.37/attachment/onlyoffice/測試v3.docx"},"documentType":"word","editorConfig":{"callbackUrl":"http://192.168.137.1:8081/url-to-callback?id=10","customization":{"uiTheme":"theme-dark","unit":"cm","wordHeadingsColor":"#00ff00","zoom":100},"user":{"id":"0","name":"127.0.0.1"},"lang":"zh-CN","mode":"edit","region":"zh-CN"},"height":"100%","type":"desktop","width":"100%"}jwt_enabled, err := web.AppConfig.String("JWT_ENABLED")if err != nil {logs.Error(err)}if jwt_enabled == "true" {jwt_secret, err := web.AppConfig.String("onlyoffice_token_secret")if err != nil {logs.Error(err)}key := onlyofficeJwtManager{[]byte(jwt_secret)}logs.Info(key)token, err := key.Sign(onlyofficeconfig) // 這里用了官方的代碼if err != nil {logs.Error(err)}c.Data["json"] = map[string]interface{}{"state": "SUCCESS", "info": "SUCCESS", "jwt": token}c.ServeJSON()return}c.Data["json"] = map[string]interface{}{"state": "SUCCESS", "info": "SUCCESS", "jwt": onlyofficeconfig}c.ServeJSON()
}

?開源項目代碼庫:3xxx (hotqin888) (github.com)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/73608.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/73608.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/73608.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android wifi的開關Settings值異常分析

Android wifi的開關Settings值異常分析 文章目錄 Android wifi的開關Settings值異常分析一、前言二、異常分析1、adb或者串口獲取Settings的wifi開關值2、代碼獲取wifi開關值3、根據日志分析代碼(1)logcat 對應的wifi開啟日志的代碼①WifiServiceImpl.java② WifiSettingsStore…

C#的委托Action

在 C# 中,Action 是一個預定義的委托類型,它位于 System 命名空間下。下面詳細介紹它的作用和使用方法。 作用 Action 委托的主要作用是封裝一個方法,這個方法沒有返回值(即返回類型為 void)。它提供了一種簡潔的方式…

Qt MainWindow簡單例子(文本編輯)

使用Qt控件練習文本編輯窗口的創建。 #ifndef MAINWINDOW_H #define MAINWINDOW_H#include <QMainWindow> #include <QLabel> #include <QProgressBar>QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACEclass MainWindow : public Q…

DeepSeek-prompt指令-當DeepSeek答非所問,應該如何準確的表達我們的訴求?

當DeepSeek答非所問&#xff0c;應該如何準確的表達我們的訴求&#xff1f;不同使用場景如何向DeepSeek發問&#xff1f;是否有指令公式&#xff1f; 目錄 1、 扮演專家型指令2、 知識蒸餾型指令3、 顆粒度調節型指令4、 時間軸推演型指令5、 極端測試型6、 逆向思維型指令7、…

Mac中nvm切換node版本失敗,關閉終端再次打開還是之前的node

Mac中使用 nvm 管理 node 版本&#xff0c;在使用指令&#xff1a;nvm use XXX 切換版本之后。 關閉終端&#xff0c;再次打開&#xff0c;輸入 node -v 還是得到之前的 node 版本。 原因&#xff1a; 在這里這個 default 中有個 node 的版本號&#xff0c;使用 nvm use 時&a…

織夢dedecmsV5.7提示信息提示框美化(帶安裝教程和效果展示)

一、效果展示 1、安裝前效果 2、安裝后效果 二、安裝說明 1、安裝測試版本&#xff1a;DedeCMS-V5.7.117-UTF8&#xff1b; 2、必須在修改代碼之前請做好文件備份&#xff0c;以免誤操無法恢復&#xff1b; 3、為了兼容其他版本&#xff0c;請在安裝時&#xff0c;最好將替…

Science Advances 視觸覺傳感機制的交互裝置,可以實時測量來自手不同部位的分布力

近日&#xff0c;由香港科技大學&#xff08;HKUST&#xff09;電子與計算機工程學系申亞京教授領導的研究團隊&#xff0c;提出了一種基于數字通道的觸覺交互系統&#xff0c;可以實時測量來自手不同部位的分布力&#xff0c;有望在醫學評估、體育訓練、機器人和虛擬現實&…

MySQL單表查詢大全【SELECT】

山再高&#xff0c;往上攀&#xff0c;總能登頂&#xff1b;路再長&#xff0c;走下去&#xff0c;定能到達。 Mysql中Select 的用法 ------前言------【SELECT】0.【準備工作】0.1 創建一個庫0.2 庫中創建表0.3 表中加入一些數據 1.【查詢全部】2.【查詢指定列】2.1查詢指定列…

Vue調用子組件init方法時報錯Cannot read properties of undefined (reading ‘init‘)解決方法

調用init方法語句寫在this.$nextTick(() > {});方法里&#xff0c;因為nextTick方法在頁面元素加載完之后調用 this.$nextTick(() > {this.$refs.chartComponent.init();});如果還報錯&#xff1a;Error in nextTick: "TypeError: Cannot read properties of undef…

怎么解決在Mac上每次打開文件夾都會彈出一個新窗口的問題

在Mac上每次打開文件夾都會彈出一個新窗口的問題&#xff0c;可以通過以下方法解決? ?調整Finder設置?&#xff1a; 打開Finder&#xff0c;點擊“Finder”菜單&#xff0c;選擇“偏好設置”。在偏好設置中&#xff0c;選擇“通用”標簽。取消勾選“在標簽頁中打開文件夾”或…

從 Prop Drilling 到 Context:React 狀態管理的演進與抉擇

Context的出現解決了什么問題&#xff1f; Vue中的provide/inject和React中的Context非常相似&#xff0c;具體區別如下&#xff1a; 可以看到實際上最大的區別在于Vue是響應式&#xff0c;React是非響應式 那么context具體解決了什么問題&#xff1f;我們先看下面這個例子&a…

考研408-數據結構完整代碼 線性表的順序存儲結構 - 順序表

線性表的順序存儲結構 - 順序表 1. 順序表的定義 ? 用一組地址連續的存儲單元依次存儲線性表的數據元素&#xff0c;從而使邏輯上相鄰的兩個元素在物理位置上也相鄰 2. 順序表的特點 隨機訪問&#xff1a; 即通過首地址和元素序號可以在O(1) 時間內找到指定元素&#xff0…

【經驗分享】SpringBoot集成WebSocket開發02 之 實現一個基本示例并Spring Bean注入的方式來組織代碼

結合Spring Boot和WebSocket實現一個基本示例&#xff0c;并且使用Spring Bean注入的方式來組織代碼。 1. 創建Spring Boot項目 首先&#xff0c;確保你有一個Spring Boot項目&#xff0c;并在pom.xml文件中引入了WebSocket相關的依賴。 <dependencies><!-- Spring…

DeepSeek-R1大模型微調技術深度解析:架構、方法與應用全解析

1. DeepSeek-R1大模型架構設計與技術特性 1.1 架構設計 DeepSeek-R1作為超大規模語言模型,其核心架構設計包含以下創新: 專家混合架構(MoE) 采用6710億參數的混合專家架構(MoE),每個推理過程僅激活370億參數,實現計算效率與資源利用率的突破性提升。 Transformer框架…

本地部署Hive集群

規劃 服務機器Hive本體部署在Node1元數據服務所需的關系型數據庫(MYSQL)部署在Node1 安裝MYSQL數據庫 # 更新密鑰 rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022# 安裝Mysql yum庫 rpm -Uvh http://repo.mysql.com//mysql57-community-release-el7-7.noarch.…

緩存之美:Guava Cache 相比于 Caffeine 差在哪里?

大家好&#xff0c;我是 方圓。本文將結合 Guava Cache 的源碼來分析它的實現原理&#xff0c;并闡述它相比于 Caffeine Cache 在性能上的劣勢。為了讓大家對 Guava Cache 理解起來更容易&#xff0c;我們還是在開篇介紹它的原理&#xff1a; Guava Cache 通過分段&#xff08;…

2025年【廣東省安全員C證第四批(專職安全生產管理人員)】考試及廣東省安全員C證第四批(專職安全生產管理人員)模擬試題

安全生產是各行各業不可忽視的重要環節&#xff0c;特別是在廣東省這樣的經濟大省&#xff0c;安全生產的重要性更是不言而喻。為了確保安全生產管理人員具備足夠的專業知識和實際操作能力&#xff0c;廣東省定期舉辦安全員C證考試。本文將詳細介紹2025年廣東省安全員C證第四批…

傳輸層自學

傳輸實體&#xff1a;完成傳輸層任務的硬件或軟件 可能位于&#xff1a; 操作系統內核獨立的用戶進程綁定在網絡應用中的鏈接庫網絡接口卡 1.功能&#xff1a; 網絡層與傳輸層作用范圍比較&#xff1f; 網絡層負責把數據從源機送達到目的機 傳輸層負責把數據送達到具體的應…

【C語言】函數和數組實踐與應用:開發簡單的掃雷游戲

【C語言】函數和數組實踐與應用&#xff1a;開發簡單的掃雷游戲 1.掃雷游戲分析和設計1.1掃雷游戲的功能說明&#xff08;游戲規則&#xff09;1.2游戲的分析與設計1.2.1游戲的分析1.2.2 文件結構設計 2. 代碼實現2.1 game.h文件2.2 game.c文件2.3 test.c文件 3. 游戲運行效果4…

Spring Cloud Config - 動態配置管理與高可用治理

引言&#xff1a;為什么需要配置中心&#xff1f; 在微服務架構中&#xff0c;配置管理面臨分散化、多環境、動態更新三大挑戰。傳統基于application.yml等配置文件的硬編碼方式&#xff0c;導致以下問題&#xff1a; ? 環境差異&#xff1a;開發、測試、生產環境配置混雜&a…