Pārlūkot izejas kodu

增加session和登录鉴权

zhusiqing 4 gadi atpakaļ
vecāks
revīzija
0c44a0e541
6 mainītis faili ar 169 papildinājumiem un 8 dzēšanām
  1. 9 1
      package.json
  2. 11 2
      src/app.ts
  3. 40 3
      src/controllers/index.ts
  4. 24 0
      src/middlewares/auth.ts
  5. 14 0
      src/middlewares/session.ts
  6. 71 2
      yarn.lock

+ 9 - 1
package.json

@@ -1,7 +1,12 @@
 {
   "name": "gateway",
   "version": "1.0.0",
-  "keywords": ["node", "koa", "redis", "typescript"],
+  "keywords": [
+    "node",
+    "koa",
+    "redis",
+    "typescript"
+  ],
   "description": "一个基于node+ts+koa的网关服务",
   "main": "index.js",
   "license": "MIT",
@@ -16,6 +21,7 @@
     "koa-bodyparser": "^4.3.0",
     "koa-helmet": "^5.2.0",
     "koa-router": "^9.4.0",
+    "koa-session": "^6.0.0",
     "koa-static": "^5.0.0",
     "log4js": "^6.3.0",
     "nodemon": "^2.0.4",
@@ -24,7 +30,9 @@
   },
   "devDependencies": {
     "@types/koa": "^2.11.4",
+    "@types/koa-bodyparser": "^4.3.0",
     "@types/koa-router": "^7.4.1",
+    "@types/koa-session": "^5.10.2",
     "@types/node": "^14.11.2",
     "@types/redis": "^2.8.27",
     "ts-node": "^9.0.0",

+ 11 - 2
src/app.ts

@@ -15,6 +15,8 @@ import redisMiddleware from './middlewares/redis';
 import limitMiddleware from './middlewares/limit';
 import logsMiddleware from './middlewares/logs';
 import responseMiddleware from './middlewares/response';
+import sessionMiddleware from './middlewares/session';
+import authMiddleware from './middlewares/auth';
 
 const app = new Koa<DefaultState, Context>();
 
@@ -23,6 +25,12 @@ const app = new Koa<DefaultState, Context>();
 app.use(helmet());
 // 静态资源
 app.use(koaStatic(path.join(__dirname, config.staticPath)))
+// 返回体格式
+app.use(responseMiddleware());
+// session
+app.use(sessionMiddleware(app))
+// auth
+app.use(authMiddleware())
 // post params解析
 app.use(bodyParser());
 // 日志
@@ -31,8 +39,7 @@ app.use(logsMiddleware());
 app.use(redisMiddleware());
 // 限流
 app.use(limitMiddleware());
-// 返回体格式
-app.use(responseMiddleware());
+
 
 
 
@@ -43,6 +50,8 @@ app.on('error', (err, ctx: Context) => {
 // api 路由
 const apiRouter = new Router<DefaultState, Context>();
 apiRouter.get('/code', controllers.code);
+apiRouter.post('/login', controllers.login);
+apiRouter.get('/user-info', controllers.userInfo);
 // 主路由
 const router = new Router<DefaultState, Context>();
 router.get('/', controllers.home);

+ 40 - 3
src/controllers/index.ts

@@ -1,11 +1,14 @@
 import { Context } from 'koa';
 import services from '../services';
+interface sessionInterface {
+  user?: string
+}
 
-export const home = async (ctx: Context) => {
+const home = async (ctx: Context) => {
   ctx.body = 'home';
 };
 
-export const code = async (ctx: Context) => {
+const code = async (ctx: Context) => {
   interface params {
     phone?: string
   }
@@ -20,7 +23,41 @@ export const code = async (ctx: Context) => {
   ctx.body = ctx.$response(body);
 };
 
+const login = async (ctx: Context) => {
+  const { username, password } = ctx.request.body
+  if (!username) {
+    ctx.body = ctx.$response(null, '用户名不能为空', false)
+    return
+  }
+  if (!password) {
+    ctx.body = ctx.$response(null, '密码不能为空', false)
+    return
+  }
+  const dbInfo = {
+    username: 'zhusiqing',
+    password: '123456'
+  }
+  if (username === dbInfo.username && password === dbInfo.password) {
+    if (ctx.session) {
+      ctx.session.user = username
+    }
+    ctx.body = ctx.$response({ username }, '登录成功', true)
+  } else {
+    ctx.body = ctx.$response(null, '用户名或者密码错误', false)
+  }
+}
+const userInfo = async (ctx: Context) => {
+  if (!ctx.session || !ctx.session.user ) {
+    ctx.body = ctx.$response(null, '未登录', false)
+    return
+  }
+  const session: sessionInterface = ctx.session.toJSON()
+  ctx.body = ctx.$response({ username: session.user })
+}
+
 export default {
   home,
-  code
+  code,
+  login,
+  userInfo
 }

+ 24 - 0
src/middlewares/auth.ts

@@ -0,0 +1,24 @@
+import { Context, Next } from 'koa';
+interface sessionInterface {
+  user?: string
+}
+const noAuths = ['/api/login']
+export default () => {
+  return async (ctx: Context, next: Next) => {
+    if (noAuths.includes(ctx.url)) {
+      await next()
+      return
+    }
+    if (ctx.session) {
+      const session: sessionInterface = ctx.session.toJSON()
+      if (!session.user) {
+        ctx.session.user = null
+        ctx.body = ctx.$response(null, '未登录', false)
+        return
+      }
+      await next()
+    } else {
+      ctx.throw(500, 'session获取失败')
+    }
+  }
+}

+ 14 - 0
src/middlewares/session.ts

@@ -0,0 +1,14 @@
+import session from 'koa-session';
+export default (app) => {
+  app.keys = ['a1b2c3d4']
+  const config = {
+    // maxAge: 8.6410e6,
+    // overwrite: true,
+    httpOnly: true,
+    signed: true, // 是否签名
+    rolling: false, // 是否每次响应时刷新session的有效期
+    renew: false, // 是否在session快过期时刷新session有效期
+    // secure: true
+  };
+  return session(config, app)
+}

+ 71 - 2
yarn.lock

@@ -183,6 +183,13 @@
   resolved "https://registry.yarnpkg.com/@types/keygrip/-/keygrip-1.0.2.tgz#513abfd256d7ad0bf1ee1873606317b33b1b2a72"
   integrity sha512-GJhpTepz2udxGexqos8wgaBx4I/zWIDPh/KOGEwAqtuGDkOUJu5eFvwmdBX4AmB8Odsr+9pHCQqiAqDL/yKMKw==
 
+"@types/koa-bodyparser@^4.3.0":
+  version "4.3.0"
+  resolved "https://registry.yarnpkg.com/@types/koa-bodyparser/-/koa-bodyparser-4.3.0.tgz#54ecd662c45f3a4fa9de849528de5fc8ab269ba5"
+  integrity sha512-aB/vwwq4G9FAtKzqZ2p8UHTscXxZvICFKVjuckqxCtkX1Ro7F5KHkTCUqTRZFBgDoEkmeca+bFLI1bIsdPPZTA==
+  dependencies:
+    "@types/koa" "*"
+
 "@types/koa-compose@*":
   version "3.2.5"
   resolved "https://registry.yarnpkg.com/@types/koa-compose/-/koa-compose-3.2.5.tgz#85eb2e80ac50be95f37ccf8c407c09bbe3468e9d"
@@ -197,6 +204,14 @@
   dependencies:
     "@types/koa" "*"
 
+"@types/koa-session@^5.10.2":
+  version "5.10.2"
+  resolved "https://registry.yarnpkg.com/@types/koa-session/-/koa-session-5.10.2.tgz#5f07931313e5c0000b47bbd59a64e69bbaf08e84"
+  integrity sha512-BAEiWtYAh0L2PutFkuQgWE6JJHjQiSxtmriLVBbReZmrt3SlMbhjzC3lxhdazjrcHuDSj89DlYIxLMNTMq9Bag==
+  dependencies:
+    "@types/cookies" "*"
+    "@types/koa" "*"
+
 "@types/koa@*", "@types/koa@^2.11.4":
   version "2.11.4"
   resolved "https://registry.yarnpkg.com/@types/koa/-/koa-2.11.4.tgz#8af02a069a9f8e08fa47b8da28d982e652f69cfb"
@@ -389,6 +404,11 @@ balanced-match@^1.0.0:
   resolved "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz#89b4d199ab2bee49de164ea02b89ce462d71b767"
   integrity sha1-ibTRmasr7kneFk6gK4nORi1xt2c=
 
+base64-js@^1.0.2:
+  version "1.3.1"
+  resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz#58ece8cb75dd07e71ed08c736abc5fac4dbf8df1"
+  integrity sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==
+
 binary-extensions@^2.0.0:
   version "2.1.0"
   resolved "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.1.0.tgz#30fa40c9e7fe07dbc895678cd287024dea241dd9"
@@ -438,6 +458,14 @@ buffer-from@^1.0.0:
   resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz#32713bc028f75c02fdb710d7c7bcec1f2c6070ef"
   integrity sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==
 
+buffer@^5.1.0:
+  version "5.6.0"
+  resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.6.0.tgz#a31749dc7d81d84db08abf937b6b8c4033f62786"
+  integrity sha512-/gDYp/UtU0eA1ys8bOs9J6a+E/KWIY+DZ+Q2WESNUA0jFRsJOc0SNUO6xJ5SGA1xueg3NL65W6s+NY5l9cunuw==
+  dependencies:
+    base64-js "^1.0.2"
+    ieee754 "^1.1.4"
+
 bytes@3.1.0:
   version "3.1.0"
   resolved "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz#f6cf7933a360e0588fa9fde85651cdc7f805d1f6"
@@ -618,11 +646,18 @@ copy-to@^2.0.1:
   resolved "https://registry.yarnpkg.com/copy-to/-/copy-to-2.0.1.tgz#2680fbb8068a48d08656b6098092bdafc906f4a5"
   integrity sha1-JoD7uAaKSNCGVrYJgJK9r8kG9KU=
 
-core-util-is@~1.0.0:
+core-util-is@^1.0.2, core-util-is@~1.0.0:
   version "1.0.2"
   resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz#b5fd54220aa2bc5ab57aab7140c940754503c1a7"
   integrity sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=
 
+crc@^3.4.4:
+  version "3.8.0"
+  resolved "https://registry.yarnpkg.com/crc/-/crc-3.8.0.tgz#ad60269c2c856f8c299e2c4cc0de4556914056c6"
+  integrity sha512-iX3mfgcTMIq3ZKLIsVFAbv7+Mc10kxabAGQb8HvjA1o3T1PIYprbakQ65d3I+2HGHt6nSKkM9PYjgoJO2KcFBQ==
+  dependencies:
+    buffer "^5.1.0"
+
 cron@1.8.2:
   version "1.8.2"
   resolved "https://registry.yarnpkg.com/cron/-/cron-1.8.2.tgz#4ac5e3c55ba8c163d84f3407bde94632da8370ce"
@@ -1191,6 +1226,11 @@ iconv-lite@0.4.24, iconv-lite@^0.4.4:
   dependencies:
     safer-buffer ">= 2.1.2 < 3"
 
+ieee754@^1.1.4:
+  version "1.1.13"
+  resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz#ec168558e95aa181fd87d37f55c32bbcb6708b84"
+  integrity sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==
+
 ignore-by-default@^1.0.1:
   version "1.0.1"
   resolved "https://registry.yarnpkg.com/ignore-by-default/-/ignore-by-default-1.0.1.tgz#48ca6d72f6c6a3af00a9ad4ae6876be3889e2b09"
@@ -1253,6 +1293,11 @@ is-ci@^2.0.0:
   dependencies:
     ci-info "^2.0.0"
 
+is-class-hotfix@~0.0.6:
+  version "0.0.6"
+  resolved "https://registry.yarnpkg.com/is-class-hotfix/-/is-class-hotfix-0.0.6.tgz#a527d31fb23279281dde5f385c77b5de70a72435"
+  integrity sha512-0n+pzCC6ICtVr/WXnN2f03TK/3BfXY7me4cjCAqT8TYXEl0+JBRoqBo94JJHXcyDSLUeWbNX8Fvy5g5RJdAstQ==
+
 is-extglob@^2.1.1:
   version "2.1.1"
   resolved "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz#a88c02535791f02ed37c76a1b9ea9773c833f8c2"
@@ -1308,6 +1353,15 @@ is-path-inside@^3.0.1:
   resolved "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-3.0.2.tgz#f5220fc82a3e233757291dddc9c5877f2a1f3017"
   integrity sha512-/2UGPSgmtqwo1ktx8NDHjuPwZWmHhO+gj0f93EkhLB5RgW9RZevWYYlIkS6zePc6U2WpOdQYIwHe9YC4DWEBVg==
 
+is-type-of@^1.0.0:
+  version "1.2.1"
+  resolved "https://registry.yarnpkg.com/is-type-of/-/is-type-of-1.2.1.tgz#e263ec3857aceb4f28c47130ec78db09a920f8c5"
+  integrity sha512-uK0kyX9LZYhSDS7H2sVJQJop1UnWPWmo5RvR3q2kFH6AUHYs7sOrVg0b4nyBHw29kRRNFofYN/JbHZDlHiItTA==
+  dependencies:
+    core-util-is "^1.0.2"
+    is-class-hotfix "~0.0.6"
+    isstream "~0.1.2"
+
 is-typedarray@^1.0.0:
   version "1.0.0"
   resolved "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz#e479c80858df0c1b11ddda6940f96011fcda4a9a"
@@ -1333,6 +1387,11 @@ isexe@^2.0.0:
   resolved "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10"
   integrity sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=
 
+isstream@~0.1.2:
+  version "0.1.2"
+  resolved "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz#47e63f7af55afa6f92e1500e690eb8b8529c099a"
+  integrity sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=
+
 json-buffer@3.0.0:
   version "3.0.0"
   resolved "https://registry.yarnpkg.com/json-buffer/-/json-buffer-3.0.0.tgz#5b1f397afc75d677bde8bcfc0e47e1f9a3d9a898"
@@ -1414,6 +1473,16 @@ koa-send@^5.0.0:
     http-errors "^1.7.3"
     resolve-path "^1.4.0"
 
+koa-session@^6.0.0:
+  version "6.0.0"
+  resolved "https://registry.yarnpkg.com/koa-session/-/koa-session-6.0.0.tgz#abe0a1083caa362277d7923c0b3c6474c980c348"
+  integrity sha512-mEj2ximzLqoypk0Q+/JLu0j7fuMk/fL+yiBM0RKmxBqdImKxq3hfnpHLwpMhwya05z/W8i7vawpFl+lsYTZbAg==
+  dependencies:
+    crc "^3.4.4"
+    debug "^3.1.0"
+    is-type-of "^1.0.0"
+    uuid "^3.3.2"
+
 koa-static@^5.0.0:
   version "5.0.0"
   resolved "https://registry.yarnpkg.com/koa-static/-/koa-static-5.0.0.tgz#5e92fc96b537ad5219f425319c95b64772776943"
@@ -2425,7 +2494,7 @@ util-deprecate@~1.0.1:
   resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
   integrity sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=
 
-uuid@^3.2.1:
+uuid@^3.2.1, uuid@^3.3.2:
   version "3.4.0"
   resolved "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz#b23e4358afa8a202fe7a100af1f5f883f02007ee"
   integrity sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==