From 9e430390b10dbd1e64276d8ce61214a002513f5c Mon Sep 17 00:00:00 2001 From: berniehuang2008 Date: Wed, 14 Feb 2024 14:59:54 +0800 Subject: [PATCH 01/12] [service] Verify --- services/verify/db.py | 24 +++++++++ services/verify/main.py | 106 ++++++++++++++++++++++++++++++++++++++ services/verify/utils.py | 6 +++ services/verify/verify.py | 65 +++++++++++++++++++++++ 4 files changed, 201 insertions(+) create mode 100644 services/verify/db.py create mode 100644 services/verify/main.py create mode 100644 services/verify/utils.py create mode 100644 services/verify/verify.py diff --git a/services/verify/db.py b/services/verify/db.py new file mode 100644 index 0000000..ddc743a --- /dev/null +++ b/services/verify/db.py @@ -0,0 +1,24 @@ +from pony.orm import Database, Required, PrimaryKey + +""" Create Database """ +db = Database() + + +class OutsideVerifyCode(db.Entity): + code = PrimaryKey(str) + session = Required(str) + expired = Required(int) + callbackURI = Required(str) + + +class InsideVerifyCode(db.Entity): + code = PrimaryKey(str) + session = Required(str) + expired = Required(int) + + +db.bind(provider="sqlite", filename="verify.db") + +db.generate_mapping(create_tables=True) + +from pony.orm import db_session diff --git a/services/verify/main.py b/services/verify/main.py new file mode 100644 index 0000000..5e0e606 --- /dev/null +++ b/services/verify/main.py @@ -0,0 +1,106 @@ +""" +[service] Verify Service + +* this: 本服务 +* s1: 调用本服务的服务 +* client: 用户的客户端 + +1. [s1] 请求内网api "/newVerify" 来进行一个新的验证 (需提供一个回调地址、一个 session ID) +2. [client] 通过路由请求内部api "/verifyOutsideCode" 进行验证 +3. [this] 将 [client] 重定向到 " ?s= &v= " (`SUCCESS` 为 `0/1`, 代表验证失败/成功, `INSIDE-CODE` 为内部验证码) +4. [s1] 请求内网api "/verifyInsideCode" 验证 `INSIDE-CODE` +5. [s1] 根据返回字段 `ok` 判断验证是否成功, `sess` 来恢复会话 + +""" +import flask +from flask import request + +import verify + +app = flask.Flask(__name__) + + +@app.route("/newVerify", methods=["GET"]) +def newVerify(): + """ + [内部] 进行一个新的验证 + + [Request] + method: str = [email] + session: str + callbackURI: str (建议使用绝对路径) + + [Response] + { + code: int + } + """ + method = request.args.get("method") + session = request.args.get("session") + callbackURI = request.args.get("callbackURI") + + code = verify.genOutsideCode(session, callbackURI) + + if method == "email": + # [TODO]: Send Email + print("Send Email:", code) + pass + + return {"code": 0} + + +@app.route("/verifyOutsideCode", methods=["GET"]) +def verifyOutsideCode(): + """ + [外部] 验证外部验证码 + + [Request] + code: str + + [Response] + Redirect + """ + code = request.args.get("code") + + result = verify.verifyOutsideCode(code) + if result: + sess = result["session"] + callbackURI = result["callbackURI"] + + insideCode = verify.genInsideCode(sess) + redirectURI = f"{callbackURI}?s=1&v={insideCode}" + else: + redirectURI = "ERROR: Invalid Verification Link" + + print("Redirect to", redirectURI) + + return redirectURI + + +@app.route("/verifyInsideCode", methods=["GET"]) +def verifyInsideCode(): + """ + [内部] 验证内部验证码 + + [Request] + code: str + + [Response] + { + code: int, + ok: bool, + sess: str + } + """ + code = request.args.get("code") + + result = verify.verifyInsideCode(code) + if result: + return {"code": 0, "ok": True, "sess": result["session"]} + else: + return {"code": -1} + + + +if __name__ == "__main__": + app.run("localhost", 5003) diff --git a/services/verify/utils.py b/services/verify/utils.py new file mode 100644 index 0000000..e75e6e0 --- /dev/null +++ b/services/verify/utils.py @@ -0,0 +1,6 @@ +import random +from hashlib import sha256 + + +def genRandHash(): + return sha256(str(random.getrandbits(256)).encode()).hexdigest() diff --git a/services/verify/verify.py b/services/verify/verify.py new file mode 100644 index 0000000..a15f473 --- /dev/null +++ b/services/verify/verify.py @@ -0,0 +1,65 @@ +import time +import db +import utils + + +def genOutsideCode(session, callbackURI): + """Generate a new outside code""" + with db.db_session: + code = utils.genRandHash() + expired = int(time.time()) + 60 * 10 # 10 minutes + + db.OutsideVerifyCode( + code=code, session=session, expired=expired, callbackURI=callbackURI + ) + + return code + + +def genInsideCode(session): + """Generate a new inside code""" + with db.db_session: + code = utils.genRandHash() + expired = int(time.time()) + 60 * 1 # 1 minutes + + db.InsideVerifyCode(code=code, session=session, expired=expired) + + return code + + +def verifyOutsideCode(code): + """Verify the outside code""" + with db.db_session: + result = db.OutsideVerifyCode.get(code=code) + + # [Check]: If code is valid + if result is None: + return None + + result = result.to_dict() + db.OutsideVerifyCode[code].delete() + + # [Check]: If code is expired + if result["expired"] < time.time(): + return None + + return result + + +def verifyInsideCode(code): + """Verify the inside code""" + with db.db_session: + result = db.InsideVerifyCode.get(code=code) + + # [Check]: If code is valid + if result is None: + return None + + result = result.to_dict() + db.InsideVerifyCode[code].delete() + + # [Check]: If code is expired + if result["expired"] < time.time(): + return None + + return result From fd69ae3c0d7e966d8d76e9dc4a2ecc59fb9f08d2 Mon Sep 17 00:00:00 2001 From: berniehuang2008 Date: Wed, 14 Feb 2024 19:19:26 +0800 Subject: [PATCH 02/12] [feat] send email logic --- services/verify/main.py | 19 +++-- services/verify/send.py | 161 ++++++++++++++++++++++++++++++++++++++ services/verify/verify.py | 1 + 3 files changed, 173 insertions(+), 8 deletions(-) create mode 100644 services/verify/send.py diff --git a/services/verify/main.py b/services/verify/main.py index 5e0e606..5c056e4 100644 --- a/services/verify/main.py +++ b/services/verify/main.py @@ -16,6 +16,7 @@ from flask import request import verify +import send app = flask.Flask(__name__) @@ -26,9 +27,10 @@ def newVerify(): [内部] 进行一个新的验证 [Request] - method: str = [email] + method: str (one of [email]) + target: str (e.g. "test@openteens.org") session: str - callbackURI: str (建议使用绝对路径) + callbackURI: str (建议使用带https的绝对路径) [Response] { @@ -36,16 +38,17 @@ def newVerify(): } """ method = request.args.get("method") + target = request.args.get("target") session = request.args.get("session") callbackURI = request.args.get("callbackURI") code = verify.genOutsideCode(session, callbackURI) if method == "email": - # [TODO]: Send Email - print("Send Email:", code) - pass - + send.sendEmail(target, code) + else: + return {"code": -1} + return {"code": 0} @@ -55,7 +58,7 @@ def verifyOutsideCode(): [外部] 验证外部验证码 [Request] - code: str + code: str (外部验证码) [Response] Redirect @@ -83,7 +86,7 @@ def verifyInsideCode(): [内部] 验证内部验证码 [Request] - code: str + code: str (内部验证码) [Response] { diff --git a/services/verify/send.py b/services/verify/send.py new file mode 100644 index 0000000..bcdba7c --- /dev/null +++ b/services/verify/send.py @@ -0,0 +1,161 @@ +def sendEmail(target, code): + """ + 发送验证邮件 + """ + + template = """ + + + + + 邮箱验证码 + + + + + + + + + +
+
+ + +
+
+
+
+ 尊敬的用户:您好! + + 您正在进行邮箱验证,请点击以下链接完成验证: + + 若不是您在操作,请忽略此邮件。 +
+ + 如果您无法点击以上链接,请将此链接复制到浏览器地址栏中访问。 + https://api.openteens.org/userVerify?code={} + +
+
+
+
+
+

此为系统邮件,请勿回复
+

+

—— OpenTeens 社区

+
+
+
+ + """ + + title = "OpenTeens 邮箱验证" + from_ = "OpenTeens " + to = target + content = template.format(code, code, code) + + diff --git a/services/verify/verify.py b/services/verify/verify.py index a15f473..b8947a5 100644 --- a/services/verify/verify.py +++ b/services/verify/verify.py @@ -1,4 +1,5 @@ import time + import db import utils From 476fd53bb21c3f97c1562a7de5f785cd0c8d7bc8 Mon Sep 17 00:00:00 2001 From: berniehuang2008 Date: Wed, 14 Feb 2024 14:59:54 +0800 Subject: [PATCH 03/12] [service] Verify --- services/verify/db.py | 24 +++++++++ services/verify/main.py | 106 ++++++++++++++++++++++++++++++++++++++ services/verify/utils.py | 6 +++ services/verify/verify.py | 65 +++++++++++++++++++++++ 4 files changed, 201 insertions(+) create mode 100644 services/verify/db.py create mode 100644 services/verify/main.py create mode 100644 services/verify/utils.py create mode 100644 services/verify/verify.py diff --git a/services/verify/db.py b/services/verify/db.py new file mode 100644 index 0000000..ddc743a --- /dev/null +++ b/services/verify/db.py @@ -0,0 +1,24 @@ +from pony.orm import Database, Required, PrimaryKey + +""" Create Database """ +db = Database() + + +class OutsideVerifyCode(db.Entity): + code = PrimaryKey(str) + session = Required(str) + expired = Required(int) + callbackURI = Required(str) + + +class InsideVerifyCode(db.Entity): + code = PrimaryKey(str) + session = Required(str) + expired = Required(int) + + +db.bind(provider="sqlite", filename="verify.db") + +db.generate_mapping(create_tables=True) + +from pony.orm import db_session diff --git a/services/verify/main.py b/services/verify/main.py new file mode 100644 index 0000000..5e0e606 --- /dev/null +++ b/services/verify/main.py @@ -0,0 +1,106 @@ +""" +[service] Verify Service + +* this: 本服务 +* s1: 调用本服务的服务 +* client: 用户的客户端 + +1. [s1] 请求内网api "/newVerify" 来进行一个新的验证 (需提供一个回调地址、一个 session ID) +2. [client] 通过路由请求内部api "/verifyOutsideCode" 进行验证 +3. [this] 将 [client] 重定向到 " ?s= &v= " (`SUCCESS` 为 `0/1`, 代表验证失败/成功, `INSIDE-CODE` 为内部验证码) +4. [s1] 请求内网api "/verifyInsideCode" 验证 `INSIDE-CODE` +5. [s1] 根据返回字段 `ok` 判断验证是否成功, `sess` 来恢复会话 + +""" +import flask +from flask import request + +import verify + +app = flask.Flask(__name__) + + +@app.route("/newVerify", methods=["GET"]) +def newVerify(): + """ + [内部] 进行一个新的验证 + + [Request] + method: str = [email] + session: str + callbackURI: str (建议使用绝对路径) + + [Response] + { + code: int + } + """ + method = request.args.get("method") + session = request.args.get("session") + callbackURI = request.args.get("callbackURI") + + code = verify.genOutsideCode(session, callbackURI) + + if method == "email": + # [TODO]: Send Email + print("Send Email:", code) + pass + + return {"code": 0} + + +@app.route("/verifyOutsideCode", methods=["GET"]) +def verifyOutsideCode(): + """ + [外部] 验证外部验证码 + + [Request] + code: str + + [Response] + Redirect + """ + code = request.args.get("code") + + result = verify.verifyOutsideCode(code) + if result: + sess = result["session"] + callbackURI = result["callbackURI"] + + insideCode = verify.genInsideCode(sess) + redirectURI = f"{callbackURI}?s=1&v={insideCode}" + else: + redirectURI = "ERROR: Invalid Verification Link" + + print("Redirect to", redirectURI) + + return redirectURI + + +@app.route("/verifyInsideCode", methods=["GET"]) +def verifyInsideCode(): + """ + [内部] 验证内部验证码 + + [Request] + code: str + + [Response] + { + code: int, + ok: bool, + sess: str + } + """ + code = request.args.get("code") + + result = verify.verifyInsideCode(code) + if result: + return {"code": 0, "ok": True, "sess": result["session"]} + else: + return {"code": -1} + + + +if __name__ == "__main__": + app.run("localhost", 5003) diff --git a/services/verify/utils.py b/services/verify/utils.py new file mode 100644 index 0000000..e75e6e0 --- /dev/null +++ b/services/verify/utils.py @@ -0,0 +1,6 @@ +import random +from hashlib import sha256 + + +def genRandHash(): + return sha256(str(random.getrandbits(256)).encode()).hexdigest() diff --git a/services/verify/verify.py b/services/verify/verify.py new file mode 100644 index 0000000..a15f473 --- /dev/null +++ b/services/verify/verify.py @@ -0,0 +1,65 @@ +import time +import db +import utils + + +def genOutsideCode(session, callbackURI): + """Generate a new outside code""" + with db.db_session: + code = utils.genRandHash() + expired = int(time.time()) + 60 * 10 # 10 minutes + + db.OutsideVerifyCode( + code=code, session=session, expired=expired, callbackURI=callbackURI + ) + + return code + + +def genInsideCode(session): + """Generate a new inside code""" + with db.db_session: + code = utils.genRandHash() + expired = int(time.time()) + 60 * 1 # 1 minutes + + db.InsideVerifyCode(code=code, session=session, expired=expired) + + return code + + +def verifyOutsideCode(code): + """Verify the outside code""" + with db.db_session: + result = db.OutsideVerifyCode.get(code=code) + + # [Check]: If code is valid + if result is None: + return None + + result = result.to_dict() + db.OutsideVerifyCode[code].delete() + + # [Check]: If code is expired + if result["expired"] < time.time(): + return None + + return result + + +def verifyInsideCode(code): + """Verify the inside code""" + with db.db_session: + result = db.InsideVerifyCode.get(code=code) + + # [Check]: If code is valid + if result is None: + return None + + result = result.to_dict() + db.InsideVerifyCode[code].delete() + + # [Check]: If code is expired + if result["expired"] < time.time(): + return None + + return result From 7979c6c318b7b5b1fc93f6376a04c84723c5c458 Mon Sep 17 00:00:00 2001 From: berniehuang2008 Date: Wed, 14 Feb 2024 19:19:26 +0800 Subject: [PATCH 04/12] [feat] send email logic --- services/verify/main.py | 19 +++-- services/verify/send.py | 161 ++++++++++++++++++++++++++++++++++++++ services/verify/verify.py | 1 + 3 files changed, 173 insertions(+), 8 deletions(-) create mode 100644 services/verify/send.py diff --git a/services/verify/main.py b/services/verify/main.py index 5e0e606..5c056e4 100644 --- a/services/verify/main.py +++ b/services/verify/main.py @@ -16,6 +16,7 @@ from flask import request import verify +import send app = flask.Flask(__name__) @@ -26,9 +27,10 @@ def newVerify(): [内部] 进行一个新的验证 [Request] - method: str = [email] + method: str (one of [email]) + target: str (e.g. "test@openteens.org") session: str - callbackURI: str (建议使用绝对路径) + callbackURI: str (建议使用带https的绝对路径) [Response] { @@ -36,16 +38,17 @@ def newVerify(): } """ method = request.args.get("method") + target = request.args.get("target") session = request.args.get("session") callbackURI = request.args.get("callbackURI") code = verify.genOutsideCode(session, callbackURI) if method == "email": - # [TODO]: Send Email - print("Send Email:", code) - pass - + send.sendEmail(target, code) + else: + return {"code": -1} + return {"code": 0} @@ -55,7 +58,7 @@ def verifyOutsideCode(): [外部] 验证外部验证码 [Request] - code: str + code: str (外部验证码) [Response] Redirect @@ -83,7 +86,7 @@ def verifyInsideCode(): [内部] 验证内部验证码 [Request] - code: str + code: str (内部验证码) [Response] { diff --git a/services/verify/send.py b/services/verify/send.py new file mode 100644 index 0000000..bcdba7c --- /dev/null +++ b/services/verify/send.py @@ -0,0 +1,161 @@ +def sendEmail(target, code): + """ + 发送验证邮件 + """ + + template = """ + + + + + 邮箱验证码 + + + + + + + + + +
+
+ + +
+
+
+
+ 尊敬的用户:您好! + + 您正在进行邮箱验证,请点击以下链接完成验证: + + 若不是您在操作,请忽略此邮件。 +
+ + 如果您无法点击以上链接,请将此链接复制到浏览器地址栏中访问。 + https://api.openteens.org/userVerify?code={} + +
+
+
+
+
+

此为系统邮件,请勿回复
+

+

—— OpenTeens 社区

+
+
+
+ + """ + + title = "OpenTeens 邮箱验证" + from_ = "OpenTeens " + to = target + content = template.format(code, code, code) + + diff --git a/services/verify/verify.py b/services/verify/verify.py index a15f473..b8947a5 100644 --- a/services/verify/verify.py +++ b/services/verify/verify.py @@ -1,4 +1,5 @@ import time + import db import utils From ab2a644e429bca39b7a88dd4cae23292793a5451 Mon Sep 17 00:00:00 2001 From: berniehuang2008 Date: Sat, 17 Feb 2024 22:44:05 +0800 Subject: [PATCH 05/12] [refactor] Refactor to match the new auto-import --- services/verify/__init__.py | 30 +++++++ services/verify/main.py | 109 ------------------------- services/verify/router.py | 155 ++++++++++++++++++++++++++++++++++++ services/verify/send.py | 8 +- 4 files changed, 189 insertions(+), 113 deletions(-) create mode 100644 services/verify/__init__.py delete mode 100644 services/verify/main.py create mode 100644 services/verify/router.py diff --git a/services/verify/__init__.py b/services/verify/__init__.py new file mode 100644 index 0000000..a4495d4 --- /dev/null +++ b/services/verify/__init__.py @@ -0,0 +1,30 @@ +""" + +""" + +from fastapi import APIRouter +from dynaconf import Dynaconf + +from . import router + +router.init(APIRouter(prefix="/verify")) + + +def entrypoint(settings: Dynaconf): + return { + "Author": "Bernie H.", + "Version": "1.0.0", + "Describe": "验证微服务,主要用于验证用户的邮箱等。", + "Router": router.router, + "Init": lambda: init(settings), + } + + +g_settings = None + + +def init(settings: Dynaconf): + print("Verify service is starting...") + global g_settings + g_settings = settings + diff --git a/services/verify/main.py b/services/verify/main.py deleted file mode 100644 index 5c056e4..0000000 --- a/services/verify/main.py +++ /dev/null @@ -1,109 +0,0 @@ -""" -[service] Verify Service - -* this: 本服务 -* s1: 调用本服务的服务 -* client: 用户的客户端 - -1. [s1] 请求内网api "/newVerify" 来进行一个新的验证 (需提供一个回调地址、一个 session ID) -2. [client] 通过路由请求内部api "/verifyOutsideCode" 进行验证 -3. [this] 将 [client] 重定向到 " ?s= &v= " (`SUCCESS` 为 `0/1`, 代表验证失败/成功, `INSIDE-CODE` 为内部验证码) -4. [s1] 请求内网api "/verifyInsideCode" 验证 `INSIDE-CODE` -5. [s1] 根据返回字段 `ok` 判断验证是否成功, `sess` 来恢复会话 - -""" -import flask -from flask import request - -import verify -import send - -app = flask.Flask(__name__) - - -@app.route("/newVerify", methods=["GET"]) -def newVerify(): - """ - [内部] 进行一个新的验证 - - [Request] - method: str (one of [email]) - target: str (e.g. "test@openteens.org") - session: str - callbackURI: str (建议使用带https的绝对路径) - - [Response] - { - code: int - } - """ - method = request.args.get("method") - target = request.args.get("target") - session = request.args.get("session") - callbackURI = request.args.get("callbackURI") - - code = verify.genOutsideCode(session, callbackURI) - - if method == "email": - send.sendEmail(target, code) - else: - return {"code": -1} - - return {"code": 0} - - -@app.route("/verifyOutsideCode", methods=["GET"]) -def verifyOutsideCode(): - """ - [外部] 验证外部验证码 - - [Request] - code: str (外部验证码) - - [Response] - Redirect - """ - code = request.args.get("code") - - result = verify.verifyOutsideCode(code) - if result: - sess = result["session"] - callbackURI = result["callbackURI"] - - insideCode = verify.genInsideCode(sess) - redirectURI = f"{callbackURI}?s=1&v={insideCode}" - else: - redirectURI = "ERROR: Invalid Verification Link" - - print("Redirect to", redirectURI) - - return redirectURI - - -@app.route("/verifyInsideCode", methods=["GET"]) -def verifyInsideCode(): - """ - [内部] 验证内部验证码 - - [Request] - code: str (内部验证码) - - [Response] - { - code: int, - ok: bool, - sess: str - } - """ - code = request.args.get("code") - - result = verify.verifyInsideCode(code) - if result: - return {"code": 0, "ok": True, "sess": result["session"]} - else: - return {"code": -1} - - - -if __name__ == "__main__": - app.run("localhost", 5003) diff --git a/services/verify/router.py b/services/verify/router.py new file mode 100644 index 0000000..bfdfb5a --- /dev/null +++ b/services/verify/router.py @@ -0,0 +1,155 @@ +""" +[service] Verify Service + +* this: 本服务 +* s1: 调用本服务的服务 +* client: 用户的客户端 + +1. [s1] 请求内网api "/newVerify" 来进行一个新的验证 (需提供一个回调地址、一个 session ID) +2. [client] 通过路由请求内部api "/verifyOutsideCode" 进行验证 +3. [this] 将 [client] 重定向到 " ?s= &v= " (`SUCCESS` 为 `0/1`, 代表验证失败/成功, `INSIDE-CODE` 为内部验证码) +4. [s1] 请求内网api "/verifyInsideCode" 验证 `INSIDE-CODE` +5. [s1] 根据返回字段 `ok` 判断验证是否成功, `sess` 来恢复会话 + +""" + +import fastapi +from fastapi import Request, Response, redirect + +import verify +import send + + +router = None + + +def init(r: fastapi.APIRouter): + global router + + r.add_route("/newVerify", newVerify, methods=["GET"]) + r.add_route("/verifyOutsideCode", verifyOutsideCode, methods=["GET"]) + r.add_route("/verifyInsideCode", verifyInsideCode, methods=["GET"]) + + router = r + + +def _getVerifyUri(code: str): + """ + [Tool] 从验证码生成验证链接 + """ + return f"https://openteens.org/verify?code={code}" + +def newVerify(): + """ + [内部] 进行一个新的验证 + + Request: + method: str (one of [email]) + target: str (e.g. "test@openteens.org") + session: str + callbackURI: str (建议使用带https的绝对路径) + + Response: + ..codeblock:: json + { + code: int + } + """ + request = Request() + + method = request.args.get("method") + target = request.args.get("target") + session = request.args.get("session") + callbackURI = request.args.get("callbackURI") + + code = verify.genOutsideCode(session, callbackURI) + + if method == "email": + send.sendEmail(target, _getVerifyUri(code)) + else: + return {"code": -1} + + return {"code": 0} + + +def newVerifyCode(): + """ + [内部] 进行一个新的验证(返回验证码) + + Request: + session: str + callbackURI: str (建议使用带https的绝对路径) + + Response: + ..codeblock:: json + { + code: int, + verifyUri: str + } + """ + request = Request() + + session = request.args.get("session") + callbackURI = request.args.get("callbackURI") + + code = verify.genOutsideCode(session, callbackURI) + + return {"code": 0, "verifyUri": _getVerifyUri(code)} + + +def verifyOutsideCode(): + """ + [外部] 验证外部验证码 + + Request: + code: str (外部验证码) + + Response: + (重定向到回调地址) + """ + request = Request() + + code = request.args.get("code") + + result = verify.verifyOutsideCode(code) + if result: + sess = result["session"] + callbackURI = result["callbackURI"] + + insideCode = verify.genInsideCode(sess) + redirectURI = f"{callbackURI}?s=1&v={insideCode}" + else: + redirectURI = "ERROR: Invalid Verification Link" + + return redirect(redirectURI) + + +def verifyInsideCode(): + """ + [内部] 验证内部验证码 + + Request: + code: str (内部验证码) + + Response: + ..codeblock:: json + { + code: int, + ok: bool, + sess: str + } + """ + request = Request() + + code = request.args.get("code") + + result = verify.verifyInsideCode(code) + if result: + return {"code": 0, "ok": True, "sess": result["session"]} + else: + return {"code": -1} + + +if __name__ == "__main__": + init(fastapi.APIRouter()) + router.run("localhost", 5003) diff --git a/services/verify/send.py b/services/verify/send.py index bcdba7c..d5d2f23 100644 --- a/services/verify/send.py +++ b/services/verify/send.py @@ -1,4 +1,4 @@ -def sendEmail(target, code): +def sendEmail(target, uri): """ 发送验证邮件 """ @@ -128,13 +128,13 @@ def sendEmail(target, code): 您正在进行邮箱验证,请点击以下链接完成验证: 若不是您在操作,请忽略此邮件。
如果您无法点击以上链接,请将此链接复制到浏览器地址栏中访问。 - https://api.openteens.org/userVerify?code={} + {}
@@ -156,6 +156,6 @@ def sendEmail(target, code): title = "OpenTeens 邮箱验证" from_ = "OpenTeens " to = target - content = template.format(code, code, code) + content = template.format(uri, uri, uri) From bb478dde807085fbcca60cb8abfa886afc8fbb23 Mon Sep 17 00:00:00 2001 From: berniehuang2008 Date: Sat, 17 Feb 2024 23:01:14 +0800 Subject: [PATCH 06/12] [refactor] refactor code to match the inter-public router framework --- services/verify/__init__.py | 5 +++-- services/verify/router.py | 20 ++++++++++++-------- 2 files changed, 15 insertions(+), 10 deletions(-) diff --git a/services/verify/__init__.py b/services/verify/__init__.py index a4495d4..d1a15e2 100644 --- a/services/verify/__init__.py +++ b/services/verify/__init__.py @@ -7,7 +7,7 @@ from . import router -router.init(APIRouter(prefix="/verify")) +router.init(APIRouter(prefix="/verify"), APIRouter(prefix="/verify")) def entrypoint(settings: Dynaconf): @@ -15,7 +15,8 @@ def entrypoint(settings: Dynaconf): "Author": "Bernie H.", "Version": "1.0.0", "Describe": "验证微服务,主要用于验证用户的邮箱等。", - "Router": router.router, + "InterRouter": router.inter_router, + "ExposeRouter": router.public_router, "Init": lambda: init(settings), } diff --git a/services/verify/router.py b/services/verify/router.py index bfdfb5a..87d7456 100644 --- a/services/verify/router.py +++ b/services/verify/router.py @@ -20,24 +20,28 @@ import send -router = None +inter_router = None +public_router = None -def init(r: fastapi.APIRouter): - global router +def init(ri: fastapi.APIRouter, rp: fastapi.APIRouter): + global inter_router + global public_router + inter_router = ri + public_router = rp - r.add_route("/newVerify", newVerify, methods=["GET"]) - r.add_route("/verifyOutsideCode", verifyOutsideCode, methods=["GET"]) - r.add_route("/verifyInsideCode", verifyInsideCode, methods=["GET"]) + inter_router.add_route("/newVerify", newVerify, methods=["GET"]) + inter_router.add_route("/verifyOutsideCode", verifyOutsideCode, methods=["GET"]) + inter_router.add_route("/verifyInsideCode", verifyInsideCode, methods=["GET"]) - router = r + public_router.add_route("/verify", verifyOutsideCode, methods=["GET"]) def _getVerifyUri(code: str): """ [Tool] 从验证码生成验证链接 """ - return f"https://openteens.org/verify?code={code}" + return f"https://openteens.org/verify/verify?code={code}" def newVerify(): """ From b2706b0ac0c2766c7e9ed47d7fd77c0f59227212 Mon Sep 17 00:00:00 2001 From: berniehuang2008 Date: Sat, 17 Feb 2024 23:02:54 +0800 Subject: [PATCH 07/12] [feat] Expose 'newVerifyCode' to inter api, insdead of 'newVerify' --- services/verify/router.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/services/verify/router.py b/services/verify/router.py index 87d7456..37221f9 100644 --- a/services/verify/router.py +++ b/services/verify/router.py @@ -30,7 +30,7 @@ def init(ri: fastapi.APIRouter, rp: fastapi.APIRouter): inter_router = ri public_router = rp - inter_router.add_route("/newVerify", newVerify, methods=["GET"]) + inter_router.add_route("/newVerifyCode", newVerifyCode, methods=["GET"]) inter_router.add_route("/verifyOutsideCode", verifyOutsideCode, methods=["GET"]) inter_router.add_route("/verifyInsideCode", verifyInsideCode, methods=["GET"]) @@ -78,7 +78,7 @@ def newVerify(): def newVerifyCode(): """ - [内部] 进行一个新的验证(返回验证码) + [内部] 进行一个新的验证(返回验证链接) Request: session: str From fd747b86ce1d141660b57fff21e29e394a06c754 Mon Sep 17 00:00:00 2001 From: lanbinshijie Date: Sat, 17 Feb 2024 23:39:36 +0800 Subject: [PATCH 08/12] [style] fix a grammar error --- app.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/app.py b/app.py index a692fae..791f352 100644 --- a/app.py +++ b/app.py @@ -27,15 +27,15 @@ for service in services: try: entrypoint = importlib.import_module(f"{services_path}.{service}").entrypoint - matedata = entrypoint(settings) + metadata = entrypoint(settings) logger.warn("#"*50+f""" 加载{service} -\t作者{matedata['Author']} -\t版本{matedata['Version']} -\t描述{matedata['Describe']} +\t作者{metadata['Author']} +\t版本{metadata['Version']} +\t描述{metadata['Describe']} """+"#"*50) - application.include_router(matedata['Router']) - matedata['Init']() + application.include_router(metadata['Router']) + metadata['Init']() except Exception as e: logger.warn(f"加载{service}出错") logger.warn(e) From e5ce85263085572d72e01bc53eefdc4f6abc170a Mon Sep 17 00:00:00 2001 From: lanbinshijie Date: Sat, 17 Feb 2024 23:51:21 +0800 Subject: [PATCH 09/12] [style] add an error raise --- app.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app.py b/app.py index 791f352..dcbb4e6 100644 --- a/app.py +++ b/app.py @@ -21,7 +21,7 @@ services_path='services' if not os.path.exists(services_path): logger.critical(f"{os.path.join(os.getcwd(),services_path)} 不存在") - raise + raise OSError(f"{os.path.join(os.getcwd(),services_path)} 不存在") services = os.listdir(services_path) for service in services: From 4a0b84ae4809d3be31f28c851fc3811356607347 Mon Sep 17 00:00:00 2001 From: lanbinshijie Date: Sat, 17 Feb 2024 23:52:29 +0800 Subject: [PATCH 10/12] [refactor] redirect MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit redirect报错,我重新定义了一个简单的redirect函数,不知道是不是我这边版本有问题。另外运行app.py的时候导入这个组件会导致import不正确 --- services/verify/router.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/services/verify/router.py b/services/verify/router.py index 37221f9..eb229a0 100644 --- a/services/verify/router.py +++ b/services/verify/router.py @@ -14,7 +14,7 @@ """ import fastapi -from fastapi import Request, Response, redirect +from fastapi import Request, Response import verify import send @@ -23,6 +23,8 @@ inter_router = None public_router = None +def redirect(url): + print("You redirected to:",url) def init(ri: fastapi.APIRouter, rp: fastapi.APIRouter): global inter_router From 8c9b43ebd6c0e0e43d2667ce6cb99e1f4607d51b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AE=81=E9=9D=99=E8=87=B4=E8=BF=9C?= <468835121@qq.com> Date: Sun, 18 Feb 2024 15:22:04 +0800 Subject: [PATCH 11/12] =?UTF-8?q?[fix]=20=E4=BF=AE=E5=A4=8D=E9=87=8D?= =?UTF-8?q?=E5=AE=9A=E5=90=91=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- services/verify/router.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/services/verify/router.py b/services/verify/router.py index eb229a0..0bf8f1b 100644 --- a/services/verify/router.py +++ b/services/verify/router.py @@ -15,6 +15,7 @@ import fastapi from fastapi import Request, Response +from starlette.responses import RedirectResponse import verify import send @@ -23,8 +24,6 @@ inter_router = None public_router = None -def redirect(url): - print("You redirected to:",url) def init(ri: fastapi.APIRouter, rp: fastapi.APIRouter): global inter_router @@ -127,7 +126,7 @@ def verifyOutsideCode(): else: redirectURI = "ERROR: Invalid Verification Link" - return redirect(redirectURI) + return RedirectResponse(redirectURI) def verifyInsideCode(): From ff0f54b6ea53e9ba48bacdd9ce43f2808242e778 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=AE=81=E9=9D=99=E8=87=B4=E8=BF=9C?= <468835121@qq.com> Date: Sun, 18 Feb 2024 15:32:30 +0800 Subject: [PATCH 12/12] =?UTF-8?q?[fix]=20=E4=BF=AE=E5=A4=8D=E9=87=8D?= =?UTF-8?q?=E5=AE=9A=E5=90=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- services/verify/router.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/verify/router.py b/services/verify/router.py index 0bf8f1b..0a871ea 100644 --- a/services/verify/router.py +++ b/services/verify/router.py @@ -157,4 +157,4 @@ def verifyInsideCode(): if __name__ == "__main__": init(fastapi.APIRouter()) - router.run("localhost", 5003) + # router.run("localhost", 5003)