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黑白并非简单的色…...

CTF show Web 红包题第六弹
提示 1.不是SQL注入 2.需要找关键源码 思路 进入页面发现是一个登录框,很难让人不联想到SQL注入,但提示都说了不是SQL注入,所以就不往这方面想了 先查看一下网页源码,发现一段JavaScript代码,有一个关键类ctfs…...

Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...

2025年能源电力系统与流体力学国际会议 (EPSFD 2025)
2025年能源电力系统与流体力学国际会议(EPSFD 2025)将于本年度在美丽的杭州盛大召开。作为全球能源、电力系统以及流体力学领域的顶级盛会,EPSFD 2025旨在为来自世界各地的科学家、工程师和研究人员提供一个展示最新研究成果、分享实践经验及…...
uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖
在前面的练习中,每个页面需要使用ref,onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入,需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

uniapp微信小程序视频实时流+pc端预览方案
方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度WebSocket图片帧定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐RTMP推流TRTC/即构SDK推流❌ 付费方案 (部分有免费额度&#x…...
LLM基础1_语言模型如何处理文本
基于GitHub项目:https://github.com/datawhalechina/llms-from-scratch-cn 工具介绍 tiktoken:OpenAI开发的专业"分词器" torch:Facebook开发的强力计算引擎,相当于超级计算器 理解词嵌入:给词语画"…...

12.找到字符串中所有字母异位词
🧠 题目解析 题目描述: 给定两个字符串 s 和 p,找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义: 若两个字符串包含的字符种类和出现次数完全相同,顺序无所谓,则互为…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...

多种风格导航菜单 HTML 实现(附源码)
下面我将为您展示 6 种不同风格的导航菜单实现,每种都包含完整 HTML、CSS 和 JavaScript 代码。 1. 简约水平导航栏 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport&qu…...