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黑白并非简单的色…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
屋顶变身“发电站” ,中天合创屋面分布式光伏发电项目顺利并网!
5月28日,中天合创屋面分布式光伏发电项目顺利并网发电,该项目位于内蒙古自治区鄂尔多斯市乌审旗,项目利用中天合创聚乙烯、聚丙烯仓库屋面作为场地建设光伏电站,总装机容量为9.96MWp。 项目投运后,每年可节约标煤3670…...
什么?连接服务器也能可视化显示界面?:基于X11 Forwarding + CentOS + MobaXterm实战指南
文章目录 什么是X11?环境准备实战步骤1️⃣ 服务器端配置(CentOS)2️⃣ 客户端配置(MobaXterm)3️⃣ 验证X11 Forwarding4️⃣ 运行自定义GUI程序(Python示例)5️⃣ 成功效果{var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...
Spring Security 认证流程——补充
一、认证流程概述 Spring Security 的认证流程基于 过滤器链(Filter Chain),核心组件包括 UsernamePasswordAuthenticationFilter、AuthenticationManager、UserDetailsService 等。整个流程可分为以下步骤: 用户提交登录请求拦…...
Vue 3 + WebSocket 实战:公司通知实时推送功能详解
📢 Vue 3 WebSocket 实战:公司通知实时推送功能详解 📌 收藏 点赞 关注,项目中要用到推送功能时就不怕找不到了! 实时通知是企业系统中常见的功能,比如:管理员发布通知后,所有用户…...
【1】跨越技术栈鸿沟:字节跳动开源TRAE AI编程IDE的实战体验
2024年初,人工智能编程工具领域发生了一次静默的变革。当字节跳动宣布退出其TRAE项目(一款融合大型语言模型能力的云端AI编程IDE)时,技术社区曾短暂叹息。然而这一退场并非终点——通过开源社区的接力,TRAE在WayToAGI等…...
网页端 js 读取发票里的二维码信息(图片和PDF格式)
起因 为了实现在报销流程中,发票不能重用的限制,发票上传后,希望能读出发票号,并记录发票号已用,下次不再可用于报销。 基于上面的需求,研究了OCR 的方式和读PDF的方式,实际是可行的ÿ…...
