docker部署onlyoffice,开启JWT权限校验Token
原来的部署方式
之前的方式是禁用了JWT:
docker run -itd -p 8080:80 --name docserver --network host -e JWT_ENABLED=false --restart=always onlyoffice/documentserver:8
新的部署方式
参考文档:https://helpcenter.onlyoffice.com/installation/docs-developer-install-docker.aspx?from=api
启用JWT Token:-e JWT_SECRET=my_jwt_secret
docker run -itd -p 8080:80 --name docserver --network host -e JWT_SECRET=my_jwt_secret --restart=always onlyoffice/documentserver:8
保存容器的数据:
参考命令:
sudo docker run -i -t -d -p 80:80 --restart=always \-v /app/onlyoffice/DocumentServer/logs:/var/log/onlyoffice \-v /app/onlyoffice/DocumentServer/data:/var/www/onlyoffice/Data \-v /app/onlyoffice/DocumentServer/lib:/var/lib/onlyoffice \-v /app/onlyoffice/DocumentServer/db:/var/lib/postgresql -e JWT_SECRET=my_jwt_secret onlyoffice/documentserver-de
创建相关的目录:
cd ~/docker/docserver
mkdir logs data lib db
停止容器:
docker stop docserver && docker rm docserver
构建容器:
docker run -itd --name docserver -p 18889:80 --restart=always \-v /home/zhangdapeng/docker/docserver/logs:/var/log/onlyoffice \-v /home/zhangdapeng/docker/docserver/data:/var/www/onlyoffice/Data \-v /home/zhangdapeng/docker/docserver/lib:/var/lib/onlyoffice \-v /home/zhangdapeng/docker/docserver/db:/var/lib/postgresql -e JWT_SECRET=zhangdapeng520 onlyoffice/documentserver:8
查看容器日志:
docker logs -f --tail 100 docserver
获取JWT Token
参考文档:https://api.onlyoffice.com/zh/editors/signature/
将配置文件复制出来:
docker cp docserver:/etc/onlyoffice/documentserver/local.json .
原始默认内容:
{"services": {"CoAuthoring": {"sql": {"type": "postgres","dbHost": "localhost","dbPort": "5432","dbName": "onlyoffice","dbUser": "onlyoffice","dbPass": "onlyoffice"},"token": {"enable": {"request": {"inbox": true,"outbox": true},"browser": true},"inbox": {"header": "Authorization","inBody": false},"outbox": {"header": "Authorization","inBody": false}},"secret": {"inbox": {"string": "zhangdapeng520"},"outbox": {"string": "zhangdapeng520"},"session": {"string": "zhangdapeng520"}}}},"rabbitmq": {"url": "amqp://guest:guest@localhost"},"wopi": {"enable": false,"privateKey": "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC12HeKvvcytCl7\nvBpXP8uO8SSvntAHTT/hOZIJnCsMRs5OQiETa690iaU+Dos4xY6RyQW7jqioyWlC\n8cQXFu7JG9XhFkEmX2hIM3YouzjVnXr1C75U77q91svj2p2HG7c/UhglS/1plYuG\nmlqTMqxSKqERnbvtxpRweg629o+u9te++dJp+Lco5v0UE17xm5GmW85nG4NpMuf4\nrXx1m43nCjIPJ6+eVyDl1C1q9OoQz9azJjq6B2PDaLC/FI+HVsL55GD+CgFjmAjT\nooyqM7/5adbC4NjNGrxIi6pE28fndSiB3jlgrBYGMzK5G8fwWjbB3K+ZjZWsJY+d\n53PMueH1AgMBAAECggEADol0nDL1W2hoQCi16SkQhbSEv8T2d8oqCkAj16cHdyhH\nGgRF7tUD39EyVG2T0KDua3yCYk+E74iGZMa9OJe2bn2BeBVJqQUlUE9/QygdL4QZ\nQVl3SJ5cTQyZgqh5dMSqitVuJVEkiLPFRY61h4eCzuC/vPZHzaBuqAObhVUQAHPY\n8Y50kXFcCCsQdAuqV+jTG8+Er6nmktBBig6k+QP/XptwLtLpJiAdksVXvCDrHAJC\nzFTfDLCf0D4QIg5ecjIY/TfSOwPmXk11/xLLSmCJ9HnIWh9uReyo+aWKL748MRLk\nsVbRY4xT6DtDv5Ni47lECDQETg5h9d1NsrE4AQn40wKBgQDVbT2lu1Qma7AftFzW\nF1Zdkh1HROjnczTAJNSLhq5MkpD/WEDwbwdGdVZmW/xR+sEU1Wl/W0/gmD6PHK0i\nAJNJmWfy6/hb+/v532lUQ4pnAq/RSjatuAj/VWjO7G9INfX+HUak5UY0Wq+ISvh9\nL+C5wLUrsXrdtjh4bfpOqu0crwKBgQDaHoQ8DMCW+kTuc33zjAbpWwMAr9urcyyk\nP2V+wFoH143LY839NI6EBTYGvlWLhGW+VW30kQIfJZ6m8oUwvfye3TWSIoUNaQZ0\nGraxgp/kETfw3YtArV1urNryqLDLHQ40dkt21VmGsruZwY5BbaEBmgQeRablWjcN\nTqfbY7e8mwKBgQCtBAnduKbXHqWAji5UQEb7Q+AIToygVHyG51SGZ4AVAxwYY+sA\n/oDfVW/dOuSpcKXlxbvoSpXOdJ0CVzTjQ6QjHgFupGyJ5RS3060HallgeIUfHRKG\ncZKZqxtz46ey2ku43PLP6i2nc3yo+F3I3m9HJjm4WgBIi9friPxJmbbucQKBgEXm\n38QK5jG8dRjiJGxH5PMmOrkeosy4dYcR1iof5Pp8ZzHWg25xSHcg4Gaa2vmCbcTo\nxftJ+Z8XxFeGg47SZEJZbFCwBWn9zZap9QDAdxN1PTNRHM6WgMn2VZjM3RPK9QF1\nI8wqpa1YXGzzLe7j/mRwAn/dHJaGKfx2x660r26fAoGAKOgz+Jyh6Kz+xJwuZnV9\n0BEUfmZ96xl1PKahh4UXJllM1tdbmH05HNR8g2l3l8cLLeVadtCNLC1qxOKYgRk0\nl0qTzhn61tmWnav56dfxynUvUExWMay47NAS98GXT4umfoGWBBQYS9NQLL1GKiV1\nV618XN8sTLx4TuqsOLqf3E4=\n-----END PRIVATE KEY-----\n","privateKeyOld": "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC12HeKvvcytCl7\nvBpXP8uO8SSvntAHTT/hOZIJnCsMRs5OQiETa690iaU+Dos4xY6RyQW7jqioyWlC\n8cQXFu7JG9XhFkEmX2hIM3YouzjVnXr1C75U77q91svj2p2HG7c/UhglS/1plYuG\nmlqTMqxSKqERnbvtxpRweg629o+u9te++dJp+Lco5v0UE17xm5GmW85nG4NpMuf4\nrXx1m43nCjIPJ6+eVyDl1C1q9OoQz9azJjq6B2PDaLC/FI+HVsL55GD+CgFjmAjT\nooyqM7/5adbC4NjNGrxIi6pE28fndSiB3jlgrBYGMzK5G8fwWjbB3K+ZjZWsJY+d\n53PMueH1AgMBAAECggEADol0nDL1W2hoQCi16SkQhbSEv8T2d8oqCkAj16cHdyhH\nGgRF7tUD39EyVG2T0KDua3yCYk+E74iGZMa9OJe2bn2BeBVJqQUlUE9/QygdL4QZ\nQVl3SJ5cTQyZgqh5dMSqitVuJVEkiLPFRY61h4eCzuC/vPZHzaBuqAObhVUQAHPY\n8Y50kXFcCCsQdAuqV+jTG8+Er6nmktBBig6k+QP/XptwLtLpJiAdksVXvCDrHAJC\nzFTfDLCf0D4QIg5ecjIY/TfSOwPmXk11/xLLSmCJ9HnIWh9uReyo+aWKL748MRLk\nsVbRY4xT6DtDv5Ni47lECDQETg5h9d1NsrE4AQn40wKBgQDVbT2lu1Qma7AftFzW\nF1Zdkh1HROjnczTAJNSLhq5MkpD/WEDwbwdGdVZmW/xR+sEU1Wl/W0/gmD6PHK0i\nAJNJmWfy6/hb+/v532lUQ4pnAq/RSjatuAj/VWjO7G9INfX+HUak5UY0Wq+ISvh9\nL+C5wLUrsXrdtjh4bfpOqu0crwKBgQDaHoQ8DMCW+kTuc33zjAbpWwMAr9urcyyk\nP2V+wFoH143LY839NI6EBTYGvlWLhGW+VW30kQIfJZ6m8oUwvfye3TWSIoUNaQZ0\nGraxgp/kETfw3YtArV1urNryqLDLHQ40dkt21VmGsruZwY5BbaEBmgQeRablWjcN\nTqfbY7e8mwKBgQCtBAnduKbXHqWAji5UQEb7Q+AIToygVHyG51SGZ4AVAxwYY+sA\n/oDfVW/dOuSpcKXlxbvoSpXOdJ0CVzTjQ6QjHgFupGyJ5RS3060HallgeIUfHRKG\ncZKZqxtz46ey2ku43PLP6i2nc3yo+F3I3m9HJjm4WgBIi9friPxJmbbucQKBgEXm\n38QK5jG8dRjiJGxH5PMmOrkeosy4dYcR1iof5Pp8ZzHWg25xSHcg4Gaa2vmCbcTo\nxftJ+Z8XxFeGg47SZEJZbFCwBWn9zZap9QDAdxN1PTNRHM6WgMn2VZjM3RPK9QF1\nI8wqpa1YXGzzLe7j/mRwAn/dHJaGKfx2x660r26fAoGAKOgz+Jyh6Kz+xJwuZnV9\n0BEUfmZ96xl1PKahh4UXJllM1tdbmH05HNR8g2l3l8cLLeVadtCNLC1qxOKYgRk0\nl0qTzhn61tmWnav56dfxynUvUExWMay47NAS98GXT4umfoGWBBQYS9NQLL1GKiV1\nV618XN8sTLx4TuqsOLqf3E4=\n-----END PRIVATE KEY-----\n","publicKey": "BgIAAACkAABSU0ExAAgAAAEAAQD14bnMc+edjyWslY2Zr9zBNlrwxxu5MjMGFqxgOd6BKHXnx9tEqotIvBrN2ODC1mn5vzOqjKLTCJhjAQr+YOT5wlaHjxS/sGjDYwe6Oiaz1s8Q6vRqLdTlIFeerycPMgrnjZt1fK345zJpgxtnzlumkZvxXhMU/eYot/hp0vm+1/auj/a2DnpwlMbtu50RoSpSrDKTWpqGi5Vp/UslGFI/txuHndrjy9a9uu9Uvgv1ep3VOLsodjNIaF8mQRbh1RvJ7hYXxPFCacmoqI67BcmRjsU4iw4+pYl0r2sTIUJOzkYMK5wJkjnhP00H0J6vJPGOyz9XGrx7KbQy976Kd9i1","publicKeyOld": "BgIAAACkAABSU0ExAAgAAAEAAQD14bnMc+edjyWslY2Zr9zBNlrwxxu5MjMGFqxgOd6BKHXnx9tEqotIvBrN2ODC1mn5vzOqjKLTCJhjAQr+YOT5wlaHjxS/sGjDYwe6Oiaz1s8Q6vRqLdTlIFeerycPMgrnjZt1fK345zJpgxtnzlumkZvxXhMU/eYot/hp0vm+1/auj/a2DnpwlMbtu50RoSpSrDKTWpqGi5Vp/UslGFI/txuHndrjy9a9uu9Uvgv1ep3VOLsodjNIaF8mQRbh1RvJ7hYXxPFCacmoqI67BcmRjsU4iw4+pYl0r2sTIUJOzkYMK5wJkjnhP00H0J6vJPGOyz9XGrx7KbQy976Kd9i1","modulus": "B5D8778ABEF732B4297BBC1A573FCB8EF124AF9ED0074D3FE13992099C2B0C46CE4E4221136BAF7489A53E0E8B38C58E91C905BB8EA8A8C96942F1C41716EEC91BD5E11641265F6848337628BB38D59D7AF50BBE54EFBABDD6CBE3DA9D871BB73F5218254BFD69958B869A5A9332AC522AA1119DBBEDC694707A0EB6F68FAEF6D7BEF9D269F8B728E6FD14135EF19B91A65BCE671B836932E7F8AD7C759B8DE70A320F27AF9E5720E5D42D6AF4EA10CFD6B3263ABA0763C368B0BF148F8756C2F9E460FE0A01639808D3A28CAA33BFF969D6C2E0D8CD1ABC488BAA44DBC7E7752881DE3960AC16063332B91BC7F05A36C1DCAF998D95AC258F9DE773CCB9E1F5","modulusOld": "B5D8778ABEF732B4297BBC1A573FCB8EF124AF9ED0074D3FE13992099C2B0C46CE4E4221136BAF7489A53E0E8B38C58E91C905BB8EA8A8C96942F1C41716EEC91BD5E11641265F6848337628BB38D59D7AF50BBE54EFBABDD6CBE3DA9D871BB73F5218254BFD69958B869A5A9332AC522AA1119DBBEDC694707A0EB6F68FAEF6D7BEF9D269F8B728E6FD14135EF19B91A65BCE671B836932E7F8AD7C759B8DE70A320F27AF9E5720E5D42D6AF4EA10CFD6B3263ABA0763C368B0BF148F8756C2F9E460FE0A01639808D3A28CAA33BFF969D6C2E0D8CD1ABC488BAA44DBC7E7752881DE3960AC16063332B91BC7F05A36C1DCAF998D95AC258F9DE773CCB9E1F5","exponent": 65537,"exponentOld": 65537},"storage": {"fs": {"secretString": "HD97Gwvu8Z28TVQQOgMS"}}
}
参数说明:

修改:
{"services": {"CoAuthoring": {"sql": {"type": "postgres","dbHost": "localhost","dbPort": "5432","dbName": "onlyoffice","dbUser": "onlyoffice","dbPass": "onlyoffice"},"token": {"enable": {"request": {"inbox": true,"outbox": true},"browser": true},"inbox": {"header": "Authorization","inBody": true},"outbox": {"header": "Authorization","inBody": true}},"secret": {"inbox": {"string": "zhangdapeng520"},"outbox": {"string": "zhangdapeng520"},"session": {"string": "zhangdapeng520"}}}},"rabbitmq": {"url": "amqp://guest:guest@localhost"},"wopi": {"enable": false,"privateKey": "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC12HeKvvcytCl7\nvBpXP8uO8SSvntAHTT/hOZIJnCsMRs5OQiETa690iaU+Dos4xY6RyQW7jqioyWlC\n8cQXFu7JG9XhFkEmX2hIM3YouzjVnXr1C75U77q91svj2p2HG7c/UhglS/1plYuG\nmlqTMqxSKqERnbvtxpRweg629o+u9te++dJp+Lco5v0UE17xm5GmW85nG4NpMuf4\nrXx1m43nCjIPJ6+eVyDl1C1q9OoQz9azJjq6B2PDaLC/FI+HVsL55GD+CgFjmAjT\nooyqM7/5adbC4NjNGrxIi6pE28fndSiB3jlgrBYGMzK5G8fwWjbB3K+ZjZWsJY+d\n53PMueH1AgMBAAECggEADol0nDL1W2hoQCi16SkQhbSEv8T2d8oqCkAj16cHdyhH\nGgRF7tUD39EyVG2T0KDua3yCYk+E74iGZMa9OJe2bn2BeBVJqQUlUE9/QygdL4QZ\nQVl3SJ5cTQyZgqh5dMSqitVuJVEkiLPFRY61h4eCzuC/vPZHzaBuqAObhVUQAHPY\n8Y50kXFcCCsQdAuqV+jTG8+Er6nmktBBig6k+QP/XptwLtLpJiAdksVXvCDrHAJC\nzFTfDLCf0D4QIg5ecjIY/TfSOwPmXk11/xLLSmCJ9HnIWh9uReyo+aWKL748MRLk\nsVbRY4xT6DtDv5Ni47lECDQETg5h9d1NsrE4AQn40wKBgQDVbT2lu1Qma7AftFzW\nF1Zdkh1HROjnczTAJNSLhq5MkpD/WEDwbwdGdVZmW/xR+sEU1Wl/W0/gmD6PHK0i\nAJNJmWfy6/hb+/v532lUQ4pnAq/RSjatuAj/VWjO7G9INfX+HUak5UY0Wq+ISvh9\nL+C5wLUrsXrdtjh4bfpOqu0crwKBgQDaHoQ8DMCW+kTuc33zjAbpWwMAr9urcyyk\nP2V+wFoH143LY839NI6EBTYGvlWLhGW+VW30kQIfJZ6m8oUwvfye3TWSIoUNaQZ0\nGraxgp/kETfw3YtArV1urNryqLDLHQ40dkt21VmGsruZwY5BbaEBmgQeRablWjcN\nTqfbY7e8mwKBgQCtBAnduKbXHqWAji5UQEb7Q+AIToygVHyG51SGZ4AVAxwYY+sA\n/oDfVW/dOuSpcKXlxbvoSpXOdJ0CVzTjQ6QjHgFupGyJ5RS3060HallgeIUfHRKG\ncZKZqxtz46ey2ku43PLP6i2nc3yo+F3I3m9HJjm4WgBIi9friPxJmbbucQKBgEXm\n38QK5jG8dRjiJGxH5PMmOrkeosy4dYcR1iof5Pp8ZzHWg25xSHcg4Gaa2vmCbcTo\nxftJ+Z8XxFeGg47SZEJZbFCwBWn9zZap9QDAdxN1PTNRHM6WgMn2VZjM3RPK9QF1\nI8wqpa1YXGzzLe7j/mRwAn/dHJaGKfx2x660r26fAoGAKOgz+Jyh6Kz+xJwuZnV9\n0BEUfmZ96xl1PKahh4UXJllM1tdbmH05HNR8g2l3l8cLLeVadtCNLC1qxOKYgRk0\nl0qTzhn61tmWnav56dfxynUvUExWMay47NAS98GXT4umfoGWBBQYS9NQLL1GKiV1\nV618XN8sTLx4TuqsOLqf3E4=\n-----END PRIVATE KEY-----\n","privateKeyOld": "-----BEGIN PRIVATE KEY-----\nMIIEvQIBADANBgkqhkiG9w0BAQEFAASCBKcwggSjAgEAAoIBAQC12HeKvvcytCl7\nvBpXP8uO8SSvntAHTT/hOZIJnCsMRs5OQiETa690iaU+Dos4xY6RyQW7jqioyWlC\n8cQXFu7JG9XhFkEmX2hIM3YouzjVnXr1C75U77q91svj2p2HG7c/UhglS/1plYuG\nmlqTMqxSKqERnbvtxpRweg629o+u9te++dJp+Lco5v0UE17xm5GmW85nG4NpMuf4\nrXx1m43nCjIPJ6+eVyDl1C1q9OoQz9azJjq6B2PDaLC/FI+HVsL55GD+CgFjmAjT\nooyqM7/5adbC4NjNGrxIi6pE28fndSiB3jlgrBYGMzK5G8fwWjbB3K+ZjZWsJY+d\n53PMueH1AgMBAAECggEADol0nDL1W2hoQCi16SkQhbSEv8T2d8oqCkAj16cHdyhH\nGgRF7tUD39EyVG2T0KDua3yCYk+E74iGZMa9OJe2bn2BeBVJqQUlUE9/QygdL4QZ\nQVl3SJ5cTQyZgqh5dMSqitVuJVEkiLPFRY61h4eCzuC/vPZHzaBuqAObhVUQAHPY\n8Y50kXFcCCsQdAuqV+jTG8+Er6nmktBBig6k+QP/XptwLtLpJiAdksVXvCDrHAJC\nzFTfDLCf0D4QIg5ecjIY/TfSOwPmXk11/xLLSmCJ9HnIWh9uReyo+aWKL748MRLk\nsVbRY4xT6DtDv5Ni47lECDQETg5h9d1NsrE4AQn40wKBgQDVbT2lu1Qma7AftFzW\nF1Zdkh1HROjnczTAJNSLhq5MkpD/WEDwbwdGdVZmW/xR+sEU1Wl/W0/gmD6PHK0i\nAJNJmWfy6/hb+/v532lUQ4pnAq/RSjatuAj/VWjO7G9INfX+HUak5UY0Wq+ISvh9\nL+C5wLUrsXrdtjh4bfpOqu0crwKBgQDaHoQ8DMCW+kTuc33zjAbpWwMAr9urcyyk\nP2V+wFoH143LY839NI6EBTYGvlWLhGW+VW30kQIfJZ6m8oUwvfye3TWSIoUNaQZ0\nGraxgp/kETfw3YtArV1urNryqLDLHQ40dkt21VmGsruZwY5BbaEBmgQeRablWjcN\nTqfbY7e8mwKBgQCtBAnduKbXHqWAji5UQEb7Q+AIToygVHyG51SGZ4AVAxwYY+sA\n/oDfVW/dOuSpcKXlxbvoSpXOdJ0CVzTjQ6QjHgFupGyJ5RS3060HallgeIUfHRKG\ncZKZqxtz46ey2ku43PLP6i2nc3yo+F3I3m9HJjm4WgBIi9friPxJmbbucQKBgEXm\n38QK5jG8dRjiJGxH5PMmOrkeosy4dYcR1iof5Pp8ZzHWg25xSHcg4Gaa2vmCbcTo\nxftJ+Z8XxFeGg47SZEJZbFCwBWn9zZap9QDAdxN1PTNRHM6WgMn2VZjM3RPK9QF1\nI8wqpa1YXGzzLe7j/mRwAn/dHJaGKfx2x660r26fAoGAKOgz+Jyh6Kz+xJwuZnV9\n0BEUfmZ96xl1PKahh4UXJllM1tdbmH05HNR8g2l3l8cLLeVadtCNLC1qxOKYgRk0\nl0qTzhn61tmWnav56dfxynUvUExWMay47NAS98GXT4umfoGWBBQYS9NQLL1GKiV1\nV618XN8sTLx4TuqsOLqf3E4=\n-----END PRIVATE KEY-----\n","publicKey": "BgIAAACkAABSU0ExAAgAAAEAAQD14bnMc+edjyWslY2Zr9zBNlrwxxu5MjMGFqxgOd6BKHXnx9tEqotIvBrN2ODC1mn5vzOqjKLTCJhjAQr+YOT5wlaHjxS/sGjDYwe6Oiaz1s8Q6vRqLdTlIFeerycPMgrnjZt1fK345zJpgxtnzlumkZvxXhMU/eYot/hp0vm+1/auj/a2DnpwlMbtu50RoSpSrDKTWpqGi5Vp/UslGFI/txuHndrjy9a9uu9Uvgv1ep3VOLsodjNIaF8mQRbh1RvJ7hYXxPFCacmoqI67BcmRjsU4iw4+pYl0r2sTIUJOzkYMK5wJkjnhP00H0J6vJPGOyz9XGrx7KbQy976Kd9i1","publicKeyOld": "BgIAAACkAABSU0ExAAgAAAEAAQD14bnMc+edjyWslY2Zr9zBNlrwxxu5MjMGFqxgOd6BKHXnx9tEqotIvBrN2ODC1mn5vzOqjKLTCJhjAQr+YOT5wlaHjxS/sGjDYwe6Oiaz1s8Q6vRqLdTlIFeerycPMgrnjZt1fK345zJpgxtnzlumkZvxXhMU/eYot/hp0vm+1/auj/a2DnpwlMbtu50RoSpSrDKTWpqGi5Vp/UslGFI/txuHndrjy9a9uu9Uvgv1ep3VOLsodjNIaF8mQRbh1RvJ7hYXxPFCacmoqI67BcmRjsU4iw4+pYl0r2sTIUJOzkYMK5wJkjnhP00H0J6vJPGOyz9XGrx7KbQy976Kd9i1","modulus": "B5D8778ABEF732B4297BBC1A573FCB8EF124AF9ED0074D3FE13992099C2B0C46CE4E4221136BAF7489A53E0E8B38C58E91C905BB8EA8A8C96942F1C41716EEC91BD5E11641265F6848337628BB38D59D7AF50BBE54EFBABDD6CBE3DA9D871BB73F5218254BFD69958B869A5A9332AC522AA1119DBBEDC694707A0EB6F68FAEF6D7BEF9D269F8B728E6FD14135EF19B91A65BCE671B836932E7F8AD7C759B8DE70A320F27AF9E5720E5D42D6AF4EA10CFD6B3263ABA0763C368B0BF148F8756C2F9E460FE0A01639808D3A28CAA33BFF969D6C2E0D8CD1ABC488BAA44DBC7E7752881DE3960AC16063332B91BC7F05A36C1DCAF998D95AC258F9DE773CCB9E1F5","modulusOld": "B5D8778ABEF732B4297BBC1A573FCB8EF124AF9ED0074D3FE13992099C2B0C46CE4E4221136BAF7489A53E0E8B38C58E91C905BB8EA8A8C96942F1C41716EEC91BD5E11641265F6848337628BB38D59D7AF50BBE54EFBABDD6CBE3DA9D871BB73F5218254BFD69958B869A5A9332AC522AA1119DBBEDC694707A0EB6F68FAEF6D7BEF9D269F8B728E6FD14135EF19B91A65BCE671B836932E7F8AD7C759B8DE70A320F27AF9E5720E5D42D6AF4EA10CFD6B3263ABA0763C368B0BF148F8756C2F9E460FE0A01639808D3A28CAA33BFF969D6C2E0D8CD1ABC488BAA44DBC7E7752881DE3960AC16063332B91BC7F05A36C1DCAF998D95AC258F9DE773CCB9E1F5","exponent": 65537,"exponentOld": 65537},"storage": {"fs": {"secretString": "HD97Gwvu8Z28TVQQOgMS"}}
}
复制回去:
docker cp local.json docserver:/etc/onlyoffice/documentserver/local.json
重启:
docker restart docserver
使用Python生成Token
官方文档实例:https://api.onlyoffice.com/zh/editors/signature/#python
def encode(payload):return jwt.encode(payload, config.DOC_SERV_JWT_SECRET, algorithm='HS256')
使用zdppy_jwt框架生成Token:
import jwtkey = "zhangdapeng520"
algorithm = "HS256"
data = {"id": "1", "username": "zhangdapeng", "role": "admin"}
encoded = jwt.encode(data, key, algorithm=algorithm)
print(encoded)
得到结果:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjEiLCJ1c2VybmFtZSI6InpoYW5nZGFwZW5nIiwicm9sZSI6ImFkbWluIn0.EyayWbKV5arHahTiXkSIKb6e1wF5a2pf6NhszyjZYfE
使用之前成功的代码进行测试
后端代码:
import json
import reqimport api
from api import middleware
from api.zjson.response import JSONResponseasync def doc_callback(request):data = await api.req.get_json(request)print("callback === ", data)# status == 2 文档准备好被保存if data.get("status") == 2:req.download(data.get("url"), "data/test.docx")if data.get("status") == 6:req.download(data.get("url"), "data/test.docx")# status == 6 文档编辑会话关闭data = {"error": 0}# return JSONResponse('{"error":0}')return JSONResponse(json.dumps(data))app = api.Api(routes=[api.resp.dir_route("/dist", "data"),api.resp.post("/callback", doc_callback),],middleware=[middleware.cors()],
)if __name__ == "__main__":app.run(port=18888)
前端代码:
<!doctype html>
<html lang="en"><head><meta charset="UTF-8" /><link rel="icon" type="image/svg+xml" href="/vite.svg" /><meta name="viewport" content="width=device-width, initial-scale=1.0" /><title>Vite + Vue</title></head><body><div id="app"></div><script type="text/javascript" src="http://127.0.0.1:18889/web-apps/apps/api/documents/api.js"></script><script type="module" src="/src/main.js"></script></body>
</html>
但是,现在当我们点击加载的时候,会报如下错误:

错误原因是因为我们之前的docserver是禁用了JWT的,但是现在我们启用了,而代码还是原来的代码,没有做任何修改。
实际上,我们应该加上JWT Token相关的信息配置。
添加JWT Token
注意:token的payload必须是文档config的完整信息:https://api.onlyoffice.com/zh/editors/signature/browser

改完后token生成代码如下:
import jwtkey = "zhangdapeng520"
algorithm = "HS256"
data = {"document": {"fileType": "docx","key": "Khirz6zTPdfd7","title": "Example Document Title.docx","url": "http://127.0.0.1:18888/dist/test.docx"},"editorConfig": {"callbackUrl": "http://127.0.0.1:18888/callback","lang": "zh-CN","user": {"id": 1,"name": "zdp"},"customization": {"forcesave": True,},"coEditing": {"mode": "fast","change": True},},"documentType": "word","height": '500px',"width": '100%',}
encoded = jwt.encode(data, key, algorithm=algorithm)
print(encoded)
改完后前端代码如下:
<script setup>
import {message} from "ant-design-vue";const onLoadDocumentClick = () => {message.success("load document")// isDocument.value = truenew DocsAPI.DocEditor("doc", {"document": {"fileType": "docx","key": `Khirz6zTPdfd7`,"title": "Example Document Title.docx","url": "http://127.0.0.1:18888/dist/test.docx"},"editorConfig": {"callbackUrl": "http://127.0.0.1:18888/callback","lang": "zh-CN","user": {"id": 1,"name": `zdp`},"customization": {"forcesave": true,},"coEditing": {"mode": "fast","change": true},},"documentType": "word",height: '500px',width: '100%',token: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkb2N1bWVudCI6eyJmaWxlVHlwZSI6ImRvY3giLCJrZXkiOiJLaGlyejZ6VFBkZmQ3IiwidGl0bGUiOiJFeGFtcGxlIERvY3VtZW50IFRpdGxlLmRvY3giLCJ1cmwiOiJodHRwOi8vMTI3LjAuMC4xOjE4ODg4L2Rpc3QvdGVzdC5kb2N4In0sImVkaXRvckNvbmZpZyI6eyJjYWxsYmFja1VybCI6Imh0dHA6Ly8xMjcuMC4wLjE6MTg4ODgvY2FsbGJhY2siLCJsYW5nIjoiemgtQ04iLCJ1c2VyIjp7ImlkIjoxLCJuYW1lIjoiemRwIn0sImN1c3RvbWl6YXRpb24iOnsiZm9yY2VzYXZlIjp0cnVlfSwiY29FZGl0aW5nIjp7Im1vZGUiOiJmYXN0IiwiY2hhbmdlIjp0cnVlfX0sImRvY3VtZW50VHlwZSI6IndvcmQiLCJoZWlnaHQiOiI1MDBweCIsIndpZHRoIjoiMTAwJSJ9.AolS4haisOZc9IxQcd99ovD5FixcfswrhWOnbSRaCJw",});
}
</script>
<template><div class="bg-indigo-50 p-8 min-h-screen"><div class="bg-amber-200 p-8"><a-button type="primary" @click="onLoadDocumentClick">Load Document</a-button></div><div class="bg-amber-400 p-8 min-h-96"><div id="doc">doc</div></div></div>
</template>
此时token错误的问题已经解决了,但是出现了下载失败的问题:

解决下载失败的问题
把配置文件复制出来:
docker cp docserver:/etc/onlyoffice/documentserver/default.json ~/Downloads/default.json
修改:之前
"allowPrivateIPAddress": false,
"allowMetaIPAddress": false
修改:之后
"allowPrivateIPAddress": true,
"allowMetaIPAddress": true
把文件复制进去:
docker cp default.json docserver:/etc/onlyoffice/documentserver/default.json
进入容器:
docker exec -it docserver bash
重启相关服务:
supervisorctl restart all
或者一次性执行:
docker exec docserver supervisorctl restart all
最终解决方案
生成token:
import jwtkey = "zhangdapeng520"
algorithm = "HS256"
data = {"document": {"fileType": "docx","key": "Khirz6zTPdfd7","title": "Example Document Title.docx","url": "http://192.168.234.138:18888/dist/test.docx"},"editorConfig": {"callbackUrl": "http://192.168.234.138:18888/callback","lang": "zh-CN","user": {"id": "1","name": "zdp"},"customization": {"forcesave": True,},"coEditing": {"mode": "fast","change": True},},"documentType": "word","height": '500px',"width": '100%',}
encoded = jwt.encode(data, key, algorithm=algorithm)
print(encoded)
前端代码:
<script setup>
import {message} from "ant-design-vue";const onLoadDocumentClick = () => {message.success("load document")// isDocument.value = truenew DocsAPI.DocEditor("doc", {"document": {"fileType": "docx","key": `Khirz6zTPdfd7`,"title": "Example Document Title.docx","url": "http://192.168.234.138:18888/dist/test.docx"},"editorConfig": {"callbackUrl": "http://192.168.234.138:18888/callback","lang": "zh-CN","user": {"id": "1","name": "zdp"},"customization": {"forcesave": true,},"coEditing": {"mode": "fast","change": true},},"documentType": "word",height: '500px',width: '100%',token: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJkb2N1bWVudCI6eyJmaWxlVHlwZSI6ImRvY3giLCJrZXkiOiJLaGlyejZ6VFBkZmQ3IiwidGl0bGUiOiJFeGFtcGxlIERvY3VtZW50IFRpdGxlLmRvY3giLCJ1cmwiOiJodHRwOi8vMTkyLjE2OC4yMzQuMTM4OjE4ODg4L2Rpc3QvdGVzdC5kb2N4In0sImVkaXRvckNvbmZpZyI6eyJjYWxsYmFja1VybCI6Imh0dHA6Ly8xOTIuMTY4LjIzNC4xMzg6MTg4ODgvY2FsbGJhY2siLCJsYW5nIjoiemgtQ04iLCJ1c2VyIjp7ImlkIjoiMSIsIm5hbWUiOiJ6ZHAifSwiY3VzdG9taXphdGlvbiI6eyJmb3JjZXNhdmUiOnRydWV9LCJjb0VkaXRpbmciOnsibW9kZSI6ImZhc3QiLCJjaGFuZ2UiOnRydWV9fSwiZG9jdW1lbnRUeXBlIjoid29yZCIsImhlaWdodCI6IjUwMHB4Iiwid2lkdGgiOiIxMDAlIn0.vnSYKU22-IsBmuoSn5Po-Ukz1RrnM-G3ch3-JuJd1xg",});
}
</script>
<template><div class="bg-indigo-50 p-8 min-h-screen"><div class="bg-amber-200 p-8"><a-button type="primary" @click="onLoadDocumentClick">Load Document</a-button></div><div class="bg-amber-400 p-8 min-h-96"><div id="doc">doc</div></div></div>
</template>
总结
虽然上面的方案解决了Token校验的问题,但是,我们一开始的目标并没有实现。 那就是我们想要解决文件下载失败和保存文件失败的问题。


这两个错误实际上都是警告,不是严格错误。而且,我们的文档最终也都被成功的加载或者是保存了,实际上并没有发生错误,而我docserver文档服务发出的警告。
如果要提高用户的体验,我们还是得想办法就这两个警告给禁止掉或者解决掉。
后面继续研究。
相关文章:
docker部署onlyoffice,开启JWT权限校验Token
原来的部署方式 之前的方式是禁用了JWT: docker run -itd -p 8080:80 --name docserver --network host -e JWT_ENABLEDfalse --restartalways onlyoffice/documentserver:8 新的部署方式 参考文档:https://helpcenter.onlyoffice.com/installation/…...
Hive排序字段解析
Hive排序字段解析 在Hive中,CLUSTER BY、DISTRIBUTE BY、SORT BY和ORDER BY是用于数据分发和排序的关键子句,它们各自有不同的用途和性能特点。让我们逐一解析这些子句: 1. DISTRIBUTE BY 用途: 主要用于控制如何将数据分发到Reducer。它可…...
3101.力扣每日一题7/6 Java(接近100%解法)
博客主页:音符犹如代码系列专栏:算法练习关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ 目录 思路 解题方法 时间复杂度 空间复杂度 Code 思路 主要是基于对…...
virtualbox窗口和win10窗口的切换
1、问题: 从windows切换到虚拟机可以用快捷键 ALTTAB,但是从虚拟机到windows使用 ALTTAB 无法成功切换 2、解决方法: 按下图操作 按上面步骤设置之后,每次要从虚拟机窗口切换到windows窗口 只需要先按 CtrlAlt 跳出虚拟机窗口&…...
卫星轨道平面简单认识
目录 一、轨道平面 1.1 轨道根数 1.2 应用考虑 二、分类 2.1 根据运行高度 2.2 根据运行轨迹偏心率 2.3 根据倾角大小 三、卫星星座中的轨道平面 四、设计轨道平面的考虑因素 一、轨道平面 1.1 轨道根数 轨道平面是定义卫星或其他天体绕行另一天体运动的平面。这个平…...
IP-Guard定制函数配置说明
设置客户端配置屏蔽: 关键字:disfunc_austascrtrd 内容:1 策略效果:屏幕整个屏幕监控模块。会导致屏幕历史查询这个功能也不能使用。 security_proxy1 安全代理参数 safe_enforce_authproc进程 强制软件上 安全代理网关…...
C++常用类
C常用类 1. std::string类2. std::vector 类2.1 特性2.2 用法 1. std::string类 std::string 是 C 标准库中的一个类,用于处理字符串。它提供了许多方法来创建、操作和管理字符串,如连接、查找、比较、替换和分割等操作。std::string 类定义在 头文件中…...
React Hooks --- 分享自己开发中常用的自定义的Hooks (1)
为什么要使用自定义 Hooks 自定义 Hooks 是 React 中一种复用逻辑的机制,通过它们可以抽离组件中的逻辑,使代码更加简洁、易读、易维护。它们可以在多个组件中复用相同的逻辑,减少重复代码。 1、useThrottle 代码 import React,{ useRef,…...
uniapp H5页面设置跨域请求
记录一下本地服务在uniapp H5页面访问请求报跨域的错误 这是我在本地起的服务端口号为8088 ip大家可打开cmd 输入ipconfig 查看 第一种方法 在源码视图中配置 "devServer": {"https": false, // 是否启用 https 协议,默认false"port&q…...
使用myCobot280和OAK-D OpenCV DepthAI摄像头制作一个实时脸部跟踪的手机支架!
引言 由于YouTube和Netflix的出现,我们开始躺着看手机。然而,长时间用手拿着手机会让人感到疲劳。这次我们制作了一个可以在你眼前保持适当距离并调整位置的自动移动手机支架,让你无需用手拿着手机。请务必试试! 准备工作 这次我们…...
Xilinx FPGA:vivado关于单端ROM的一个只读小实验
一、实验要求 将生成好的voe文件里的数据使用rom读取出来,采用串口工具发送给电脑(当按键来临时)。 二、程序设计 按键消抖模块: timescale 1ns / 1ps module key_debounce(input sys_clk ,input rst_n…...
集成学习(一)Bagging
前边学习了:十大集成学习模型(简单版)-CSDN博客 Bagging又称为“装袋法”,它是所有集成学习方法当中最为著名、最为简单、也最为有效的操作之一。 在Bagging集成当中,我们并行建立多个弱评估器(通常是决策…...
Docker 中查看及修改 Redis 容器密码的实用指南
在使用 Docker 部署 Redis 容器时,有时我们需要查看或修改 Redis 的密码。本文将详细介绍如何在 Docker 中查看和修改 Redis 容器的密码,帮助你更好地管理和维护你的 Redis 实例。 一、查看 Redis 容器密码 通常在启动 Redis 容器时,我们会…...
CH09_JS的循环控制语句
第9章:Javascript循环控制语句 本章目标 掌握break关键字的使用掌握continue关键字的使用 课程回顾 for循环的特点和语法while循环的特点和语法do-while循环的特点和语法三个循环的区别 讲解内容 1. break关键字 为什么要使用break关键字 生活中,描…...
Python实现Mybatis Plus
Python实现Mybatis Plus from flask import g from sqlalchemy import asc, descclass QueryWrapperBuilder:conditions {}order_by_info {}def __new__(cls, *args, **kwargs):obj super(QueryWrapperBuilder, cls).__new__(cls)return objdef __init__(self, obj):self.o…...
卷积神经网络和Vision Transformer的对比之归纳偏置
卷积神经网络(CNN)和视觉变换器(Vision Transformer,ViT)是两种常用于图像处理的深度学习模型。它们各有优缺点,其中一个重要的区别在于它们对图像数据的“归纳偏置”(inductive bias࿰…...
Java之网络面试经典题(一)
目录 编辑 一.Session和cookie Cookie Session 二.HTTP和HTTPS的区别 三.浅谈HTTPS为什么是安全的? 四.TCP和UDP 五.GET和Post的区别 六.forward 和 redirect 的区别? 本专栏全是博主自己收集的面试题,仅可参考,不能相…...
Failed to download metadata for repo ‘docker-ce-stable‘
这个问题是由于在安装 clamav 和 clamav-update 时,无法下载 Docker CE Stable 库的元数据,可能的原因是网络连接超时或访问该网址受限。以下是一些可能的解决办法: 检查网络连接: 确保服务器的网络连接正常,尤其是与互…...
vant拍摄视频上传以及多张图片上传
数据定义 data() {return {fileList: [],vedioList: [],formData: ,fileTypes: image/png,image/jpeg,image/jpg,image/jpeg,} }, beforeMount() {this.formData new FormData() },拍摄视频上传 <van-uploaderv-if"radio 1"v-model"vedioList"accep…...
如何用手机拍出高级感黑白色调照片?华为Pura70系列XMAGE演绎黑白艺术
在影像的世界里,色彩可以让画面更丰富,更具有表现力,往往也能带来更多的视觉冲击。但有时候,黑白却有着一种独特的魅力。华为Pura 70系列XMAGE黑白风格,则给我们了一把通过纯粹艺术大门的钥匙。 XMAGE黑白并非简单的色…...
C++:std::is_convertible
C++标志库中提供is_convertible,可以测试一种类型是否可以转换为另一只类型: template <class From, class To> struct is_convertible; 使用举例: #include <iostream> #include <string>using namespace std;struct A { }; struct B : A { };int main…...
智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
select、poll、epoll 与 Reactor 模式
在高并发网络编程领域,高效处理大量连接和 I/O 事件是系统性能的关键。select、poll、epoll 作为 I/O 多路复用技术的代表,以及基于它们实现的 Reactor 模式,为开发者提供了强大的工具。本文将深入探讨这些技术的底层原理、优缺点。 一、I…...
代码随想录刷题day30
1、零钱兑换II 给你一个整数数组 coins 表示不同面额的硬币,另给一个整数 amount 表示总金额。 请你计算并返回可以凑成总金额的硬币组合数。如果任何硬币组合都无法凑出总金额,返回 0 。 假设每一种面额的硬币有无限个。 题目数据保证结果符合 32 位带…...
【C++特殊工具与技术】优化内存分配(一):C++中的内存分配
目录 一、C 内存的基本概念 1.1 内存的物理与逻辑结构 1.2 C 程序的内存区域划分 二、栈内存分配 2.1 栈内存的特点 2.2 栈内存分配示例 三、堆内存分配 3.1 new和delete操作符 4.2 内存泄漏与悬空指针问题 4.3 new和delete的重载 四、智能指针…...
[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...
Caliper 负载(Workload)详细解析
Caliper 负载(Workload)详细解析 负载(Workload)是 Caliper 性能测试的核心部分,它定义了测试期间要执行的具体合约调用行为和交易模式。下面我将全面深入地讲解负载的各个方面。 一、负载模块基本结构 一个典型的负载模块(如 workload.js)包含以下基本结构: use strict;/…...
Ubuntu Cursor升级成v1.0
0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开,快捷键也不好用,当看到 Cursor 升级后,还是蛮高兴的 1. 下载 Cursor 下载地址:https://www.cursor.com/cn/downloads 点击下载 Linux (x64) ,…...
