Однократное обновление токенов в сравнении с длительным обновлением токенов (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.

Вернуться на верх