И это всё МОЁ

Многие сайты вместо традиционного механизма сессий на основе 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:



  1. Он создается так же как и access_token только время его хранения больше?

  2. Должен ли он храниться на сервере?

  3. При использовании 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