From 4c4879a06ccc6267af80f8cf814475cee88ba9b4 Mon Sep 17 00:00:00 2001 From: zhl Date: Wed, 15 Mar 2023 16:49:34 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0ejs=E6=A8=A1=E7=89=88,=20?= =?UTF-8?q?=E7=94=A8=E4=BA=8E=E6=B8=B2=E6=9F=93email=E9=AA=8C=E8=AF=81?= =?UTF-8?q?=E7=BB=93=E6=9E=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 2 + src/api.server.ts | 5 +++ src/controllers/verify.controller.ts | 17 +++++--- templates/verify_email_error.ejs | 2 + templates/verify_email_success.ejs | 2 + yarn.lock | 58 +++++++++++++++++++++++++++- 6 files changed, 79 insertions(+), 7 deletions(-) create mode 100644 templates/verify_email_error.ejs create mode 100644 templates/verify_email_success.ejs diff --git a/package.json b/package.json index d01ae14..8016387 100644 --- a/package.json +++ b/package.json @@ -17,9 +17,11 @@ "@fastify/formbody": "^7.3.0", "@fastify/helmet": "^10.0.1", "@fastify/jwt": "^6.3.2", + "@fastify/view": "^7.4.1", "axios": "^1.1.3", "crypto": "^1.0.1", "dotenv": "^16.0.3", + "ejs": "^3.1.9", "fast-rbac": "^2.0.1", "fastify": "^4.8.1", "fastify-plugin": "^4.2.1", diff --git a/src/api.server.ts b/src/api.server.ts index 13f6a5a..7f372c1 100644 --- a/src/api.server.ts +++ b/src/api.server.ts @@ -30,6 +30,11 @@ export class ApiServer { this.server.register(zReqParserPlugin) this.server.register(helmet, { hidePoweredBy: false }) this.server.register(zTokenParserPlugin) + this.server.register(require("@fastify/view"), { + engine: { + ejs: require("ejs"), + }, + }); this.server.register(apiAuthPlugin, { secret: config.api.token_secret, diff --git a/src/controllers/verify.controller.ts b/src/controllers/verify.controller.ts index ea64451..d0eb0e0 100644 --- a/src/controllers/verify.controller.ts +++ b/src/controllers/verify.controller.ts @@ -5,8 +5,8 @@ import {Account} from "modules/Account" import {DEFAULT_VERIFY_HTML, EmailSvr} from "service/email.svr" const TOKEN_PREFIX = 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.' -class VerifyController extends BaseController { +class VerifyController extends BaseController { @router('post /email/verify') async sendVerifyEmail(req, res) { let user = req.user @@ -34,20 +34,25 @@ class VerifyController extends BaseController { async verifyEmail(req, res) { let { k } = req.params if (!k) { - throw new ZError(10, 'params mismatch') + return res.view("/templates/verify_email_error.ejs", { msg: "params mismatch" }); } const token = k.indexOf(TOKEN_PREFIX) === -1 ? TOKEN_PREFIX + k : k - const reqData = await req.jwtVerify({ extractToken: () => token}) + let reqData; + try { + reqData = await req.jwtVerify({ extractToken: () => token}) + } catch (err) { + return res.view("/templates/verify_email_error.ejs", { msg: "token invalid." }); + } if (!reqData || !reqData.id) { - throw new ZError(12, 'token error') + return res.view("/templates/verify_email_error.ejs", { msg: "token error." }); } let user = await Account.findById(reqData.id) if (!user) { - throw new ZError(13, 'user not found') + return res.view("/templates/verify_email_error.ejs", { msg: "user not found." }); } user.verified = true user.emailVerifyTime = Date.now() await user.save() - return {} + return res.view("/templates/verify_email_success.ejs" ); } } diff --git a/templates/verify_email_error.ejs b/templates/verify_email_error.ejs new file mode 100644 index 0000000..0e5c1b8 --- /dev/null +++ b/templates/verify_email_error.ejs @@ -0,0 +1,2 @@ +

Email Verify Failed

+

<%= msg %>

diff --git a/templates/verify_email_success.ejs b/templates/verify_email_success.ejs new file mode 100644 index 0000000..b5bb9bd --- /dev/null +++ b/templates/verify_email_success.ejs @@ -0,0 +1,2 @@ +

Email Verified

+

Thank you, your email address has been verified, and your account is now fully active.

diff --git a/yarn.lock b/yarn.lock index 4a296e6..1c37292 100644 --- a/yarn.lock +++ b/yarn.lock @@ -85,6 +85,14 @@ fastify-plugin "^4.0.0" steed "^1.1.3" +"@fastify/view@^7.4.1": + version "7.4.1" + resolved "https://registry.yarnpkg.com/@fastify/view/-/view-7.4.1.tgz#265daba48386a5d3f69dfc446af468d72e0a8757" + integrity sha512-ahmRmSbNVM8bIoz0BAFnY0jNigom+xbPQ9Q1ZjmNOtGVVT3nYXCxw2OMkTr9iXwrJ4Le3EtWDHlFkZ2fCQ2hJA== + dependencies: + fastify-plugin "^4.0.0" + hashlru "^2.3.0" + "@humanwhocodes/config-array@^0.10.5": version "0.10.7" resolved "https://registry.npmmirror.com/@humanwhocodes/config-array/-/config-array-0.10.7.tgz#6d53769fd0c222767e6452e8ebda825c22e9f0dc" @@ -491,6 +499,11 @@ asn1.js@^5.3.0: minimalistic-assert "^1.0.0" safer-buffer "^2.1.0" +async@^3.2.3: + version "3.2.4" + resolved "https://registry.yarnpkg.com/async/-/async-3.2.4.tgz#2d22e00f8cddeb5fde5dd33522b56d1cf569a81c" + integrity sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ== + asynckit@^0.4.0: version "0.4.0" resolved "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" @@ -552,6 +565,13 @@ brace-expansion@^1.1.7: balanced-match "^1.0.0" concat-map "0.0.1" +brace-expansion@^2.0.1: + version "2.0.1" + resolved "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-2.0.1.tgz#1edc459e0f0c548486ecf9fc99f2221364b9a0ae" + integrity sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA== + dependencies: + balanced-match "^1.0.0" + braces@^3.0.2, braces@~3.0.2: version "3.0.2" resolved "https://registry.npmmirror.com/braces/-/braces-3.0.2.tgz#3454e1a462ee8d599e236df336cd9ea4f8afe107" @@ -597,7 +617,7 @@ callsites@^3.0.0: resolved "https://registry.npmmirror.com/callsites/-/callsites-3.1.0.tgz#b3630abd8943432f54b3f0519238e33cd7df2f73" integrity sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ== -chalk@^4.0.0: +chalk@^4.0.0, chalk@^4.0.2: version "4.1.2" resolved "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz#aac4e2b7734a740867aeb16bf02aad556a1e7a01" integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== @@ -738,6 +758,13 @@ ecdsa-sig-formatter@1.0.11, ecdsa-sig-formatter@^1.0.11: dependencies: safe-buffer "^5.0.1" +ejs@^3.1.9: + version "3.1.9" + resolved "https://registry.yarnpkg.com/ejs/-/ejs-3.1.9.tgz#03c9e8777fe12686a9effcef22303ca3d8eeb361" + integrity sha512-rC+QVNMJWv+MtPgkt0y+0rVEIdbtxVADApW9JXrUVlzHetgcyczP/E7DJmWJ4fJCZF2cPcBk0laWO9ZHMG3DmQ== + dependencies: + jake "^10.8.5" + escape-string-regexp@^4.0.0: version "4.0.0" resolved "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz#14ba83a5d373e3d311e5afca29cf5bfad965bf34" @@ -1031,6 +1058,13 @@ file-entry-cache@^6.0.1: dependencies: flat-cache "^3.0.4" +filelist@^1.0.1: + version "1.0.4" + resolved "https://registry.yarnpkg.com/filelist/-/filelist-1.0.4.tgz#f78978a1e944775ff9e62e744424f215e58352b5" + integrity sha512-w1cEuf3S+DrLCQL7ET6kz+gmlJdbq9J7yXCSjK/OZCPA+qEN1WyF4ZAf0YYJa4/shHJra2t/d/r8SV4Ji+x+8Q== + dependencies: + minimatch "^5.0.1" + fill-range@^7.0.1: version "7.0.1" resolved "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz#1919a6a7c75fe38b2c7c77e5198535da9acdda40" @@ -1213,6 +1247,11 @@ has@^1.0.3: dependencies: function-bind "^1.1.1" +hashlru@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/hashlru/-/hashlru-2.3.0.tgz#5dc15928b3f6961a2056416bb3a4910216fdfb51" + integrity sha512-0cMsjjIC8I+D3M44pOQdsy0OHXGLVz6Z0beRuufhKa0KfaD2wGwAev6jILzXsd3/vpnNQJmWyZtIILqM1N+n5A== + helmet@^6.0.0: version "6.0.0" resolved "https://registry.npmmirror.com/helmet/-/helmet-6.0.0.tgz#8e183820ddccd7729a206ad73c577b264f495595" @@ -1313,6 +1352,16 @@ isexe@^2.0.0: resolved "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz#e8fbf374dc556ff8947a10dcb0572d633f2cfa10" integrity sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw== +jake@^10.8.5: + version "10.8.5" + resolved "https://registry.yarnpkg.com/jake/-/jake-10.8.5.tgz#f2183d2c59382cb274226034543b9c03b8164c46" + integrity sha512-sVpxYeuAhWt0OTWITwT98oyV0GsXyMlXCF+3L1SuafBVUIr/uILGRB+NqwkzhgXKvoJpDIpQvqkUALgdmQsQxw== + dependencies: + async "^3.2.3" + chalk "^4.0.2" + filelist "^1.0.1" + minimatch "^3.0.4" + jose@^2.0.6: version "2.0.6" resolved "https://registry.npmmirror.com/jose/-/jose-2.0.6.tgz#894ba19169af339d3911be933f913dd02fc57c7c" @@ -1580,6 +1629,13 @@ minimatch@^3.0.4, minimatch@^3.1.1, minimatch@^3.1.2: dependencies: brace-expansion "^1.1.7" +minimatch@^5.0.1: + version "5.1.6" + resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-5.1.6.tgz#1cfcb8cf5522ea69952cd2af95ae09477f122a96" + integrity sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g== + dependencies: + brace-expansion "^2.0.1" + minimist@^1.2.6: version "1.2.7" resolved "https://registry.npmmirror.com/minimist/-/minimist-1.2.7.tgz#daa1c4d91f507390437c6a8bc01078e7000c4d18"