1 回答

TA貢獻(xiàn)1803條經(jīng)驗 獲得超3個贊
使用 Flask Login 是不可能的,因為在文檔中,它說 Flask Login 使用 Cookie 或 Header 密鑰進(jìn)行身份驗證,并且無法在 WebSocket(Socket IO)中訪問它,所以我建議使用基于令牌的系統(tǒng),如 API ,使用 JWT 令牌。
@socket.on('login')
def on_login(message):
user = User.query.filter_by(email=message['email']).first()
if not user:
socket.emit('login', {'msg': "User not found"})
if not user.check_password(form['password']):
socket.emit('login', {'msg': "User not found"})
return
user = UserSchema().dump(user).data
token = jwt.encode(
{'id': user['id'], 'user': user['name']})
user['token'] = token.decode('UTF-8')
socket.emit('login', {'user': user})
然后為登錄創(chuàng)建一個裝飾器:
def login_required(f):
@wraps(f)
def decorated(message):
try:
data = jwt.decode(message['token'], globals.current_app.config['SECRET_KEY'])
try:
user = User.query.filter_by(id=data['id']).first()
Globals.current_user = UserSchema().dump(user).data
except Exception as e:
return Error.api_response(Error.USER_NOT_FOUND)
except Exception as e:
return Error.api_response(Error.INVALID_TOKEN)
return f(message)
return decorated
然后你可以像這樣使用它:
@socketio.on('my example event')
@login_required
def my_func(json):
...
但是請記住,您需要始終在您的 socketio 中傳遞令牌,以進(jìn)行服務(wù)器驗證,我建議您閱讀 Miguel Grinberh在燒瓶中休息 auth 的這篇博客
添加回答
舉報