Многие сайты вместо традиционного механизма сессий на основе cookies используют токены. Современным стандартом является JWT. Строка токена состоит из трех частей: заголовка, тела и сигнатуры. Заголовок и тело представляют соборой сериализованные JSON-данные в кодировке bas64.
При использовании JWT часто выдается два токена. Пример создания access_token:
now = datetime.utcnow()
payload = {
'exp': now + timedelta(minutes=15),
'iat': now,
'uid': user.id,
'ip': request.remote_addr
}
access_token = jwt.encode(payload, secret_key).decode()
В принципе можно сделать время жизни токена по-больше около 7-14 дней. Кража токена ничего не даст, потому что он привязан к ip.
Каков механизм создания refresh_token:
- Он создается так же как и access_token только время его хранения больше?
- Должен ли он храниться на сервере?
- При использовании refresh_token вместе с ним должен передаваться access_token? Старый access_token после обновления попадает в blacklist?
Пока только такие идеи:
def create_refresh_token(user):
ret = get_random_chars(length=31) # можно хеш от чего-нибудь посчитать
# insert into refesh_tokens values(<refresh_token>, <user.id>, <expiration_date>);
return ret
@app.route('/auth', methods=['POST'])
def authenticate():
username = request.json.get('username')
...
ret = {
'access_token': create_access_token(user),
'refresh_token': create_refresh_token(user),
}
return jsonify(ret)
@app.route('/refresh', methods=['GET'])
def refresh_token():
# Берем refresh token из заголовка Authentication: Bearer <refresh>
# select user_id from refresh_tokens where refresh_token = ? and expiration_date > now()
# из этого user_id создаем новый access_token