73 lines
1.8 KiB
Python
73 lines
1.8 KiB
Python
import datetime
|
|
import functools
|
|
import hashlib
|
|
import jwt
|
|
import logging
|
|
from odoo.http import request
|
|
|
|
|
|
def logutils():
|
|
# 创建日志的记录等级
|
|
logger = logging.getLogger(__name__)
|
|
logger.setLevel(logging.INFO)
|
|
return logger
|
|
|
|
|
|
_logging = logutils()
|
|
|
|
|
|
def set_token(user_id, user_name):
|
|
'''创建jwt token'''
|
|
payload = {
|
|
# 过期时间
|
|
'exp': datetime.datetime.utcnow() + datetime.timedelta(days=1),
|
|
# token签发者
|
|
'iss': 'system',
|
|
# token创建时间
|
|
'iat': datetime.datetime.utcnow(),
|
|
'data': {
|
|
'id': user_id,
|
|
'name': user_name,
|
|
}
|
|
}
|
|
key = hashlib.md5('yuthon'.encode('utf-8')).hexdigest()
|
|
token = jwt.encode(payload=payload, key=key, algorithm="HS256")
|
|
return token
|
|
|
|
|
|
def check_token(token):
|
|
'''验证jwt token'''
|
|
try:
|
|
key = hashlib.md5('yuthon'.encode('utf-8')).hexdigest()
|
|
payload = jwt.decode(jwt=token, key=key, algorithms="HS256")
|
|
data = payload.get('data')
|
|
if data and data.get('id'):
|
|
return payload
|
|
except Exception as e:
|
|
_logging.error(str(e))
|
|
return None
|
|
|
|
|
|
# token登录验证装饰器
|
|
def authorize(func):
|
|
@functools.wraps(func)
|
|
def wrapper(*args, **kw):
|
|
token = request.httprequest.headers.get('Authorization')
|
|
if not token:
|
|
raise ValueError('用户登录异常')
|
|
|
|
payload = check_token(token=token)
|
|
if not payload:
|
|
raise ValueError('用户登录异常')
|
|
data = payload.get('data')
|
|
user = request.env.user.search([('id', '=', data.get('id'))])
|
|
if user and user.login == data.get('name'):
|
|
request.env.uid = user.id
|
|
request.env.user = user
|
|
else:
|
|
raise ValueError('用户登录异常')
|
|
return func(*args, **kw)
|
|
|
|
return wrapper
|
|
|