Advertisement
Guest User

Untitled

a guest
May 25th, 2015
258
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.13 KB | None | 0 0
  1. @ivanhilkov @winsent
  2.  
  3. На машине, которая была без домена с внешним IP:
  4.  
  5. http://213.171.50.28:64107/
  6.  
  7. Введена новая система аутенфикации и авторизации. Авторизация описана в другой карточке будет.
  8.  
  9. Новая система аутенфикации исключает возможность использования cookies, что предполагает клиенту лично заботиться о хранилище данных. Для мобильных GUI-приложений - это не было никогда проблемой, а проблемой было для браузеров.
  10.  
  11. Ввиду достаточно давнего существования WebStorage среди браузерного API, клиент запросто может сам заботиться о правильном хранение аутенфикационных данных и данных для авторизации за счёт использования LocalStorage и SessionStorage (отличаются тем, что SessionStorage хранится только, пока вкладка открыта, LocalStorage контролируется вручную).
  12.  
  13. Алгоритм прохождения аутенфикации:
  14. 1). Сначала необходимо пройти 1-ый этап аутенфикации для получения Temporary keys.
  15.  
  16. Происходит это при помощи метода:
  17. POST /api/authentication?mode=creditianals
  18. где нужно передать (Form data, application/x-www-form-urlencoded):
  19. - Login
  20. - Password Hash (для старых аккаунтов можно SHA-256 применять, но для новых SHA-512, старые аккаунты будут выпилены, пока оставлены чисто для тестов).
  21.  
  22. После успешного выполнения запроса, будет примерно след. ответ:
  23. {
  24. "Key": "d1667a5d-cdc7-4ec4-96d5-fbed51dc1d22",
  25. "Password": "vniiVdUWxCPkVd3BMESkLjNQYPFYczh9g6qjyFZPmr5gWGcnIWaT6Qd0ewR2kBOJ",
  26. "Salt": "+rOLFoneUrHQxP8lnhwZ6EW1scp3m8iQIdKsALUh6pVm/ABYdqxKA4bFyl+Z5e7f"
  27. }
  28.  
  29. 2). Эти данные будут необходимо для составления PBKDF2-ключа ( CryptoJS поддерживает данное построение).
  30.  
  31. Как раз, все данные, которые пришли будут необходимы для создания PBKDF2-ключа:
  32.  
  33. var pbkdf2Key = pbkdf2.CreateDeriviationKey(
  34. Key,
  35. Password,
  36. Salt
  37. );
  38.  
  39. Помимо того, что нужно будет собрать ключ, нужно будет просчитать SHA-512 хэш от строки: ( Key + Base64( Pbkdf2Bytes ) ).
  40.  
  41. Байты можно запросто получить/преобразовать при помощи той же либы CryptoJS от Google.
  42.  
  43. Далее, нужно создать POST-запроса на:
  44. POST /api/authentication?mode=pbkdf2сheck
  45. где нужно передать (Form data, application/x-www-form-urlencoded):
  46. - KeyId
  47. - Base64( Pbkdf2 )
  48. - Hash ( KeyId + Base64( Pbkdf2 ) )
  49.  
  50. Далее, бекенд проверяет целостность созданного ключа и checksum, взятый при помощи хэша, если все хорошо, то будет вернет примерно след.:
  51.  
  52. {
  53. Id: verificationKeyId,
  54. EncodedKey = ConvertedToBase64String(rawKeys)
  55. }
  56.  
  57. 3). Далее, получив данные необходимо составить битовую маску (не байтовую, а именно битовую) при помощи след. мини-алгоритма:
  58. • Конвертируем строку в массив байт
  59. • Байтовый массив - выравненный и разбит по 4-е байты на одну сущность:
  60.  
  61. [ firstByte | firstBitNumber | secondByte | secondBitNumber ]
  62.  
  63. И так далее, необходимо прочитать из firstByte номер бита указанный в firstBitNumber, в secondByte прочитать значение бита указанное по номеру из secondBitNumber и так далее...
  64.  
  65. Биты читать можно запросто при помощи:
  66.  
  67. var getBit = function( bitNumber, value ) {
  68. return ( value & ( 1 << bitNumber ) ) >> bitNumber;
  69. }
  70.  
  71. Прочитав каждый бит, добавляем его в общую результирующую строку, когда будут пройдены все элементы байтового массива, будет составлена битовая маска в виде строки.
  72.  
  73. 4). Далее, нужно создать POST-запроса на:
  74.  
  75. POST /api/authentication?mode=verification
  76. где нужно передать (Form data, application/x-www-form-urlencoded):
  77. - VerificationKey <Id: verificationKeyId из прошлого ответа>
  78. - Bitmask: <строка, собранная из прошлого шага)
  79. - Hash ( VerificationKey + Bitmask )
  80.  
  81. Если было все правильно составлено, Вам выдаться ID сессии.
  82.  
  83. PS
  84. Используя булевой параметр в 1-ом запросе, LongExpiration: true
  85. сессия для клиента выдаться на 1 неделю, а не на сутки, как ранее или если не указывать данный параметр. И да, напомню, что теперь это без cookies. Браузерному клиенту необходимо вручную следить за этим, работая c WebStorage ( Session, Local storages ), т.к. cookies - это дырявая плохая вещь, неоднкратно матерящееся в вебе.
  86.  
  87. Если Вы прошли успешно все шаги, поздравляю, Вы можете теперь перейти к процессу авторизации, там есть также нововведение, нужно считать Hmac.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement