1
0
Song 4 жил өмнө
parent
commit
9f04d2d7a9

+ 2 - 1
README.md

@@ -87,7 +87,7 @@
 ## 发送消息的方式
 1. 发送纯文本消息:直接 HTTP GET 请求 `https://你的域名/前缀/消息`,缺点是有字数限制,且只能是纯文本,这是微信模板消息的限制。
 2. 发送 Markdown 消息,调用方式分为两种:
-    + GET 请求方式:`https://你的域名/前缀/?&title=消息标题&description=简短的消息描述&content=markdown格式的消息内容&[email protected]`
+    + GET 请求方式:`https://你的域名/前缀/?&title=消息标题&description=简短的消息描述&content=markdown格式的消息内容&[email protected]&token=private`
     + POST 请求方式:请求路径为 `https://你的域名/前缀/`,参数有:
         1. `type`:(可选)发送方式
             + `test`:通过微信公众号测试号推送
@@ -97,6 +97,7 @@
         3. `description`:(必填)消息的描述
         4. `content`:(可选)消息内容,支持 Markdown
         5. `email`:(可选)当该项不为空时,将强制覆盖 type 参数,强制消息类型为邮件消息,收件邮箱即此处指定的邮箱。如果 type 为 `email` 且 email 参数为空,则邮件将发送至用户设置的默认邮箱。
+        6. `token`:(可选)如果你设置了 ACCESS_TOKEN,则你需要附上该参数以验证身份。
 
 ## 待做清单
 - [x] 支持多用户。

+ 7 - 1
common/message.js

@@ -1,10 +1,16 @@
-const { getUserDefaultMethod } = require('./token');
+const { getUserDefaultMethod, checkAccessToken } = require('./token');
 const { pushWeChatMessage } = require('./wechat');
 const { pushWeChatCorpMessage } = require('./wechat-corp');
 const { pushEmailMessage } = require('./email');
 const { Message } = require('../models');
 
 async function processMessage(userPrefix, message) {
+  if (!checkAccessToken(userPrefix, message.token)) {
+    return {
+      success: false,
+      message: `invalid access token`,
+    };
+  }
   if (message.email) {
     // If message has the attribute "email", override its type.
     message.type = 'email';

+ 10 - 0
common/token.js

@@ -75,9 +75,19 @@ function getUserDefaultMethod(prefix) {
   return user.defaultMethod;
 }
 
+function checkAccessToken(prefix, token) {
+  let user = tokenStore.get(prefix);
+  if (user.accessToken === '') {
+    return true;
+  } else {
+    return user.accessToken === token;
+  }
+}
+
 module.exports = {
   initializeTokenStore,
   updateTokenStore,
   getUserDefaultMethod,
   tokenStore,
+  checkAccessToken,
 };

+ 1 - 1
routers/index.js

@@ -145,7 +145,7 @@ router.post('/configure', userRequired, async (req, res, next) => {
   for (let field in user) {
     let value = user[field];
     value = value.trim();
-    if (value) {
+    if (value || field === 'accessToken') {
       user[field] = value;
     } else {
       delete user[field];

+ 1 - 0
routers/user.js

@@ -38,6 +38,7 @@ router.all('/:userPrefix', async (req, res, next) => {
     description: req.query.description || req.body.description || '无描述',
     content: req.query.content || req.body.content,
     email: req.query.email || req.body.email,
+    token: req.query.token || req.body.token,
   };
   let result = await processMessage(userPrefix, message);
   res.json(result);

+ 1 - 1
views/index.ejs

@@ -18,7 +18,7 @@
         <div class="message-body">
             运行模式:<%= process.env.MODE === '1' ? "Heroku 模式" : "普通模式"%>
             <br>
-            内存占用: <%= (process.memoryUsage().rss / (1024 *1024)).toFixed(2) %> MB
+            内存占用<%= (process.memoryUsage().rss / (1024 *1024)).toFixed(2) %> MB
         </div>
     </article>
 </div>