Explorar el Código

登入接口
token验证

zhangnaiwen hace 2 años
padre
commit
427d50c43c

+ 2 - 2
src/app/__init__.py

@@ -2,7 +2,7 @@ from flask import Flask
 from flask_cors import CORS
 
 from app.api import api
-# from app.helpers import request_handlers
+from app.helpers import request_handlers
 
 
 def create_app():
@@ -11,7 +11,7 @@ def create_app():
 
     CORS(app)
 
-    # request_handlers.configure(app)
+    request_handlers.configure(app)
 
     api.init_app(app)
 

+ 2 - 0
src/app/api/__init__.py

@@ -1,5 +1,6 @@
 from flask_restx import Api
 
+from app.api.login import ns as login
 from app.api.users import ns as users
 from app.api.organization import ns as organization
 from app.api.role import ns as role
@@ -8,3 +9,4 @@ api = Api(version='v1.0', title='operation_management_center', description='', d
 api.add_namespace(users)
 api.add_namespace(organization)
 api.add_namespace(role)
+api.add_namespace(login)

+ 27 - 0
src/app/api/login.py

@@ -0,0 +1,27 @@
+from flask import request, jsonify
+from flask_restx import Resource, Namespace, reqparse
+from flask_jwt import JWT
+from app.defines import StatesCode
+
+from app.services.redis_service import save_oauth_token_uid
+
+ns = Namespace('login', description='登入')
+
+
+@ns.route('')
+class LoginApi(Resource):
+    @ns.doc(id='login', description='登入')
+    @ns.expect()
+    def post(self):
+        """登入"""
+        username = request.form.get('username')
+        password = request.form.get('password')
+        # 验证用户密码
+        if obj is None:
+            return jsonify(code=-1, message='登入失败', data='用户不存在')
+        if obj.verify_password(password):
+            token = generate_token(username)
+            save_oauth_token_uid(token, obj.id)
+            return jsonify(code=StatesCode.SUCCESS, message="登录成功", date=token)
+        else:
+            return jsonify(code=StatesCode.UNKNOWN_ERROR, message="登入失败", data='密码错误')

+ 2 - 3
src/app/api/organization.py

@@ -1,4 +1,4 @@
-from flask import request
+from flask import request, jsonify
 from flask_restx import Resource, Namespace, reqparse
 
 from app.defines import StatesCode
@@ -19,8 +19,7 @@ class OrganizationListApi(Resource):
             {"name": "北京电信设计院有限公司", "code": 9417, "corporate": "李四", "contacts": "李四",
              "mobile": "13912345670"}
         ]
-        return {"code": StatesCode.SUCCESS, "message": "成功", "data": data}
-
+        return jsonify(code=StatesCode.SUCCESS, message='成功', data=data)
 
 @ns.route('/organization')
 class OrganizationApi(Resource):

+ 19 - 0
src/app/helpers/request_handlers.py

@@ -0,0 +1,19 @@
+from flask import request, abort
+
+from app.services.redis_service import get_uid_from_token
+
+
+def configure(app):
+    @app.before_request
+    def authenticate():
+        """
+        这里验证token
+        :return:
+        """
+        token = request.headers.get('token')
+        if token:
+            if get_uid_from_token(token):
+                abort(200)
+
+        else:
+            abort(403)

+ 0 - 0
src/app/services/__init__.py


+ 28 - 0
src/app/services/redis_service.py

@@ -0,0 +1,28 @@
+import redis
+
+from configs.globals import REDIS_HOST, REDIS_PORT, REDIS_DB, REDIS_PWD, MOBILE_VERIFICATION_CODE_EXPIRED
+
+# Redis使用连接池
+redis_pool = redis.ConnectionPool(host=REDIS_HOST, port=REDIS_PORT, db=REDIS_DB)
+r = redis.Redis(connection_pool=redis_pool)
+
+# Redis的键,方便统一管理
+# rk前缀表示redis_key
+rk_oauth_get_uid_from_token = 'access_token:{token}'
+
+
+def save_oauth_token_uid(access_token, user_id, expired=3600):
+    # if not expired:
+    # expired = int(current_app.config.get('OAUTH2_PROVIDER_TOKEN_EXPIRES_IN', 3600))
+    k = rk_oauth_get_uid_from_token.format(token=access_token)
+    r.set(k, user_id, ex=expired)
+
+
+def del_oauth_token_uid(access_token):
+    k = rk_oauth_get_uid_from_token.format(token=access_token)
+    r.delete(k)
+
+
+def get_uid_from_token(access_token):
+    k = rk_oauth_get_uid_from_token.format(token=access_token)
+    return int(r.get(k))