🗒 Задача¶
Реализуй механизм авторизации в интернет-магазине и получения сохраненного ранее списка товаров.
Метод авторизации принимает логин и пароль, верифицирует пользователя. Креды (credentials) для входа сохрани в константы.
При успешной авторизации – метод генерирует и возвращает токен доступа. Токен - текстовая строка, генерируемая методом авторизации (32 символа, которые включают цифры и буквы англ. алфавита – специальные библиотеки использовать не нужно).
При неудачной авторизации метод возвращает null.
Метод получения корзины должен принимать токен и возвращать список товаров (содержимое переменной корзины, произвольный тип данных).
Распечатай содержимое корзины или, если вернется null, оповести пользователя о неудачной авторизации. Переменные логин и пароль для корректной авторизации проинициализированы заранее и неизменяемы.
❌ Ошибки¶
-
метод получения корзины возвращает не только содержимое корзины
-
нейминг функций не в инфинитиве
-
функции не разделяются пустыми строками
✏️ Комментарии¶
Если хочешь объявить константу, то используется ключевое слово `const val`. Константа может хранить только примитивные типы данных, например, string, int. Так же данная переменная не является константой и вынесена за пределы основного метода `fun main()`.
Почти хорошо) У тебя прослеживается паттерн - все символы строго чередуются. Это может повлиять на уникальность и возможность скомпроментировать токен. Предлагаю из трех диапазонов сделать одну строку и генерить полностью рандомную строку.
Все таки тут уже последовательность предсказуема, а значит менее секьюрна. Я бы тут сделал один интервал из разных типов чаров и из него уже брал рандомные символы
Числа и символы - это все можно представить в виде последовательностей (диапазонов). Обрати внимание на вот эту [табличку](https://www.industrialnets.ru/files/misc/ascii.pdf)
`readln()` всегда будет возвращать строку. Это ее поведение по умолчанию. Если провалиться в декларацию, видно, что вся цепочка работает исключительно со строками (нулябельными, но к readln это не относится)
Зачем создавать tokenList и рейнжы всегда. Ведь если пароль или логин не корректны, мы зря потратим процессорное время. Лучше делать это внутри if.
Вообще нет такого условия, чтобы токен обязательно содержал и строку и число. Поэтому можно в целом упростить код. Можно заранее объединить range
Можно использовать обычный StringBuilder. Или даже еще проще: `token+= tokenRange.random()`. Так как под капотом при конкатенации строк для оптимизации будет использоваться StringBuilder
🧾 Решение¶
const val CORRECT_LOGIN = "user@example.com"
const val CORRECT_PASSWORD = "securePassword123"
fun main() {
val login = "user@example.com"
val password = "securePassword123"
val token = authenticateUser(login, password)
if (token == null) {
println("Authentication failed.")
} else {
val cartContents = fetchCartContents(token)
println("Cart contents: $cartContents")
}
}
fun authenticateUser(login: String, password: String): String? {
return if (login == CORRECT_LOGIN && password == CORRECT_PASSWORD) {
generateToken()
} else {
null
}
}
fun generateToken(): String {
val number = '0'..'9'
val symbolsUpper = 'a'..'z'
val symbolsLower = 'A'..'Z'
val allowedChars = number + symbolsLower + symbolsUpper
return (1..32).map { allowedChars.random() }.joinToString("")
}
fun fetchCartContents(token: String): List<String> {
return listOf("Apple", "Banana", "Carrot")
}