Однократное обновление токенов в сравнении с длительным обновлением токенов (Django GraphQL JWT)
Я использовал как режим "Single token refresh" , так и режим "Long running refresh tokens" .
режим "Single token refresh":
GRAPHQL_JWT = {
"JWT_VERIFY_EXPIRATION": True,
"JWT_EXPIRATION_DELTA": timedelta(minutes=5),
"JWT_REFRESH_EXPIRATION_DELTA": timedelta(days=7),
}
режим "Long running refresh tokens":
GRAPHQL_JWT = {
"JWT_VERIFY_EXPIRATION": True,
"JWT_LONG_RUNNING_REFRESH_TOKEN": True, // This code is added.
"JWT_EXPIRATION_DELTA": timedelta(minutes=5),
"JWT_REFRESH_EXPIRATION_DELTA": timedelta(days=7),
}
Но я не смог получить токен обновления в режиме "Single token refresh" , запустив этот graphql ниже:
mutation {
tokenAuth(username: "admin", password: "admin") {
token
payload
refreshExpiresIn
refreshToken // Here
}
}
Затем, я получил эту ошибку:
{
"errors": [
{
"message": "Cannot query field \"refreshToken\" on type \"ObtainJSONWebToken\". Did you mean \"refreshExpiresIn\"?",
"locations": [
{
"line": 20,
"column": 5
}
]
}
]
}
Затем я удалил поле "refreshToken" и запустил этот graphql:
mutation {
tokenAuth(username: "admin", password: "admin") {
token
payload
refreshExpiresIn
# refreshToken
}
}
Затем, я смог получить этот результат без ошибки, но я все еще не смог получить маркер обновления:
{
"data": {
"tokenAuth": {
"token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjoxNjQ3MDk2MTExLCJvcmlnSWF0IjoxNjQ3MDk1ODExfQ.5AY0HGqqmy3KwW1Gb_DFO99hIvJJh_AEngRH7hSe4DM",
"payload": {
"username": "admin",
"exp": 1647096111,
"origIat": 1647095811
},
"refreshExpiresIn": 1647700611
}
}
}
Далее, когда я запустил этот graphql с полем "refreshToken" в режиме "Long running refresh tokens" :
mutation {
tokenAuth(username: "admin", password: "admin") {
token
payload
refreshExpiresIn
refreshToken // Here
}
}
Я смог успешно получить токен обновления:
{
"data": {
"tokenAuth": {
"token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VybmFtZSI6ImFkbWluIiwiZXhwIjoxNjQ3MDk1ODg0LCJvcmlnSWF0IjoxNjQ3MDk1NTg0fQ.MOfdeD4P8SNNtCu3cm83qchqZr2aMo_ToWx_NchFiuE",
"payload": {
"username": "admin",
"exp": 1647095884,
"origIat": 1647095584
},
"refreshExpiresIn": 1647700384,
"refreshToken": "9f82f2044942bdce8501c8caf026f93765ee7289" // Here
}
}
}
Насколько я знаю, для JWT, обычно есть 2 токена Access token и Refresh token, но почему я не могу получить токен обновления в режиме "Single token refresh" ? Кроме того, в чем разница между "Single token refresh" mode и "Long running refresh tokens" mode?
Как следует из названия, в режиме "Single token refresh" ("Обновление одного жетона") , вы можете получить только один токен Single token, а Single token - это комбинация токенов Access token и Refresh token. поэтому Single token имеет 2 функции Access token и Refresh token, поэтому с помощью только одного Single token, вы можете делать две вещи "получить доступ к ресурсам (функция Access token)" и "обновить одиночный токен (функция Refresh token)". Вы не можете получить токен доступа и токен обновления отдельно в режиме "Обновление одиночного токена" . Поэтому вы не можете получить маркер обновления в режиме "Single token refresh" .
В режиме "Long running refresh tokens" вы можете получить как Access token, так и Refresh token отдельно, чего вы и ожидаете и хотите. В режиме "Long running refresh tokens" вы можете сделать больше настроек, таких как Per-cookie, Unlimited refresh, Only time only use refresh token и Clear refresh tokens.