Аутентификация на основе токенов и практика

задняя часть

JSON Web Token — безопасный обмен информацией между веб-приложениямиblog.leap OA head.com/2015/09/06/…

Аутентификация на основе токеновno.OSCHINA.net/U/1771585/no…

java - проект jwt:GitHub.com/AUTH0/Java-…

Интеграция веб-приложений без сохранения состояния — интеграция jwt shiroЭтот год — год Дракона. ITeye.com/blog/204190…

 

Традиционные методы аутентификации

HTTP — это протокол без сохранения состояния, то есть он не знает, кто обращается к приложению. Здесь мы рассматриваем пользователя как клиента, клиент использует имя пользователя и пароль для прохождения аутентификации, но в следующий раз, когда клиент отправляет запрос, его необходимо снова проверить.

Решение заключается в том, что когда пользователь запрашивает вход в систему, если нет проблем, мы будем генерировать запись на стороне сервера.Эта запись может указывать, кто является вошедшим в систему пользователем, а затем отправлять идентификационный номер этой записи в клиент. Получив его, клиент сохраняет идентификационный номер в файле cookie. В следующий раз, когда пользователь отправит запрос на сервер, он может взять файл cookie с собой, чтобы сервер проверил информацию в файле cookie, чтобы увидеть, его можно использовать в сервисе.Клиент находит здесь соответствующую запись.Если да, то это означает, что пользователь прошел аутентификацию, и возвращает клиенту данные, запрошенные пользователем.

Вышеуказанный сеанс. Нам нужно сохранить сеанс, сгенерированный для вошедшего в систему пользователя на стороне сервера. Эти сеансы могут храниться в памяти, на диске или в базе данных. Нам может потребоваться периодически очищать просроченные сеансы на стороне сервера.

Метод аутентификации на основе токенов

При использовании метода аутентификации на основе токенов нет необходимости хранить учетную запись пользователя на стороне сервера. Примерный процесс выглядит следующим образом:

  1. Клиент запрашивает логин с логином и паролем
  2. Сервер получает запрос на проверку имени пользователя и пароля
  3. После успешной проверки сервер выдаст токен, а затем отправит токен клиенту.
  4. После того, как клиент получит токен, его можно сохранить, например, в файле cookie или локальном хранилище.
  5. Каждый раз, когда клиент запрашивает ресурсы с сервера, ему необходимо принести токен, выданный сервером.
  6. Сервер получает запрос, а затем проверяет токен, переданный в клиентском запросе.Если проверка прошла успешно, он возвращает запрошенные данные клиенту.

JWT

Существует много способов реализовать проверку токена, и есть несколько стандартных методов, таких как JWT, произносится: jot, что означает: JSON Web Tokens. Стандартный токен JWT состоит из трех частей:

  • header
  • payload
  • signature

Середина отделена точкой, и оба используют кодировку Base64, поэтому реальный токен выглядит так:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJuaW5naGFvLm5ldCIsImV4cCI6IjE0Mzg5NTU0NDUiLCJuYW1lIjoid2FuZ2hhbyIsImFkbWluIjp0cnVlfQ.SwyHTEx_RQppr97g4J5lKXtabJecpejuef8AqKYMAJc

Header

Часть заголовка в основном состоит из двух частей: одна — это тип токена, а другая — используемый алгоритм.Например, следующий тип — JWT, а используемый алгоритм — HS256.

{
  "typ": "JWT",
  "alg": "HS256"
}

Приведенный выше контент должен быть закодирован в Base64, поэтому он выглядит так:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9

Payload

Полезная нагрузка содержит определенное содержимое маркера. Часть этого содержимого является стандартным полем, и вы также можете добавить другое необходимое содержимое. Ниже приведены стандартные поля:

  • iss: Эмитент, эмитент
  • суб: Тема, тема
  • ауди: Аудитория, аудитория
  • exp: Срок действия, срок действия
  • нбф: не раньше
  • iat: Дата выпуска, время выпуска
  • jti: идентификатор JWT

Например, следующая полезная нагрузка использует эмитента iss и время истечения срока действия. Также есть два настраиваемых поля: одно name , а другое admin .

{
 "iss": "ninghao.net",
 "exp": "1438955445",
 "name": "wanghao",
 "admin": true
}

После использования кодировки Base64 это становится таким:

eyJpc3MiOiJuaW5naGFvLm5ldCIsImV4cCI6IjE0Mzg5NTU0NDUiLCJuYW1lIjoid2FuZ2hhbyIsImFkbWluIjp0cnVlfQ

Signature

Последней частью JWT является подпись, состоящая из трех частей, первая - это заголовок.полезная нагрузка, закодированная с помощью Base64, а затем зашифрованная с помощью алгоритма шифрования.При шифровании следует ввести секрет, который эквивалентен паролю. , который тайно хранится на стороне сервера.

Цель подписи

Последним шагом процесса подписания является собственно подписание заголовка и полезной нагрузки. Как правило, алгоритмы шифрования выдают разные выходные данные для разных входных данных. Для двух разных входных данных вероятность получения одинакового результата чрезвычайно мала (возможно, меньше, чем вероятность того, что я стану самым богатым человеком в мире). Поэтому давайте рассматривать «разные входы дают разные результаты» как неизбежное событие.

Поэтому, если кто-то изменит содержимое заголовка и полезных данных после декодирования, а затем закодирует их, подпись нового заголовка и полезных данных будет отличаться от предыдущей подписи. Более того, если вы не знаете ключ, используемый сервером для шифрования, результирующая подпись обязательно будет другой.

  • header
  • payload
  • secret

var encodedString = base64UrlEncode(header) + "." + base64UrlEncode(payload); 
HMACSHA256(encodedString, 'secret');

После обработки это выглядит так:

SwyHTEx_RQppr97g4J5lKXtabJecpejuef8AqKYMAJc

Окончательный токен, сгенерированный на сервере и отправленный клиенту, выглядит так:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJuaW5naGFvLm5ldCIsImV4cCI6IjE0Mzg5NTU0NDUiLCJuYW1lIjoid2FuZ2hhbyIsImFkbWluIjp0cnVlfQ.SwyHTEx_RQppr97g4J5lKXtabJecpejuef8AqKYMAJc

После того, как клиент получит этот Токен, он будет сохранен, и при следующей отправке запроса на сервер он заберет этот Токен с собой. Сервер получает этот Токен, а затем проверяет его и, передав, возвращает тот ресурс, который хочет клиент.

 

jwt (веб-токен json) практика весенней проверки безопасностиno.OSCHINA.net/Sprint GEM/блог/…

С точки зрения разработки системы проверка безопасности всегда является наиболее важной.От самых примитивных методов проверки сеанса и файлов cookie до соответствия стилю покоя, удовлетворения требований разделения внешнего и внутреннего интерфейса и включения запросов https. аспекты постоянно меняются. В этой статье в качестве примера используется практика jwt (веб-токен json), чтобы представить один или два.

Во-первых, давайте взглянем на концепцию jwt, Блок-схема выглядит следующим образом:

流程图

Когда пользователь инициирует запрос на вход, сервер создает зашифрованную информацию jwt в качестве возвращаемого значения токена. В последующих запросах информация jwt используется в качестве заголовка запроса. После того, как сервер правильно расшифрует, можно получить сохраненную информацию пользователя, указывающую что проверка пройдена, описание ошибки расшифровки Токен недействителен или срок его действия истек.

Зашифрованная информация jwt показана ниже и состоит из трех частей: заголовка, полезной нагрузки и подписи.

eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJqd3QiLCJpYXQiOjE0NzEyNzYyNTEsInN1YiI6IntcInVzZXJJZFwiOjEsXCJyb2xlSWRcIjoxfSIsImV4cCI6MTQ3MTMxOTQ1MX0.vW-pPSl5bU4dmORMa7UzPjBR0F6sqg3n3hQuKY8j35o

Заголовок содержит две части информации, alg относится к типу шифрования, необязательные значения — HS256, RSA и т. д., typ=JWT — фиксированное значение, указывающее тип токена.

{
    "alg": "HS256",
    "typ": "JWT"
}

Полезная нагрузка относится к информации и содержимому подписи, обычно включая iss (эмитент), exp (срок действия), sub (информация о пользователе), aud (получатель) и др. Подробную информацию см. на официальном веб-сайте.

{
    "sub": "1234567890",
    "name": "John Doe",
    "admin": true
}

Подпись — это подпись для заголовка и полезной нагрузки.

HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)

На официальном сайте jwt можно увидеть, что есть версии реализации на разных языках, здесь используется java-версия jjwt. Нечего сказать, просто посмотрите на код напрямую, шифрование и дешифрование очень просты:

/**
  * 创建 jwt
  * @param id
  * @param subject
  * @param ttlMillis
  * @return
  * @throws Exception
  */
  public String createJWT(String id, String subject, long ttlMillis) throws Exception {
       SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256 ;
       long nowMillis = System. currentTimeMillis();
       Date now = new Date( nowMillis);
       SecretKey key = generalKey();
       JwtBuilder builder = Jwts. builder()
            .setId(id)
            .setIssuedAt(now)
            .setSubject(subject)
           .signWith(signatureAlgorithm, key);
       if (ttlMillis >= 0){
           long expMillis = nowMillis + ttlMillis;
           Date exp = new Date( expMillis);
           builder.setExpiration( exp);
       }
       return builder.compact();
 }
 
  /**
  * 解密 jwt
  * @param jwt
  * @return
  * @throws Exception
  */
  public Claims parseJWT(String jwt) throws Exception{
       SecretKey key = generalKey();
       Claims claims = Jwts. parser()
          .setSigningKey( key)
          .parseClaimsJws( jwt).getBody();
       return claims;
 }

Ключи шифрования и дешифрования генерируются путем преобразования фиксированных строк; subject — это строка json с информацией о пользователе; ttlMillis относится к сроку действия токена, который короткий и требует регулярного обновления.

Представленный здесь метод обновления токена заключается в создании refreshToken с более длительным периодом действия при создании токена, а затем клиент периодически получает последний токен в соответствии с refreshToken. Запрос sse (событие отправки сервера) устанавливается между браузером и сервером для обновления. О sse было рассказано в предыдущем посте в блоге, и я не буду упоминать его здесь.

Полный исходный код этой статьи хранится на github по адресу:GitHub.com/ах дерево/весна….

Использованная литература:

(1) http://www.cnblogs.com/xiekeli/p/5607107.html

1. официальный сайт jwt:jwt.io/

2.jjwt проект:github.com/jwtk/jjwt

3. Введение в веб-токены JSON:Audition.IO/представить IO…

4. Как создать и проверить JWT в Java:storm path.com/blog/Audience – Срочно...