# Web. Практическая работа № 1.
## 1.1 Установка и настройка Ubuntu 20.04
Создадим виртуальную машину

---
Укажем установочный диск

----
Начнем установку
Укажем язык

---
Укажем локаль

---
Сетевые настройки

---
Прокси нет

----
Зеркало репозитория

---
Разметка диска

---
По умолчанию

---
Записываем разметку

---
Имя сервера, пользователя и пароль

---
Установим ssh сервер

---
Дополнительно ничего выбирать не будем

---
Процесс установки

---
Установка завершена, перезагрузка

---
Войдем в систему

---
## 1.2 Подключение репозиториев docker
```bash=
sudo apt update
```

---
```bash=
sudo apt install apt-transport-https ca-certificates curl software-properties-common
```

---
```bash=
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
```

---
```bash=
apt-key list
```

---
```bash=
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"
```

---
```bash=
sudo apt update
```

---
## 1.3 Установка Docker CE
```bash=
sudo apt install docker-ce
```


---
```bash=
sudo systemctl enable docker
```

---
```bash=
sudo service docker start
```

---
## 1.4 Установка веб-приложения https://hub.docker.com/r/bkimminich/juice-shop
```bash=
sudo docker pull bkimminich/juice-shop
```

---
```bash=
sudo usermod -aG docker user
```

---
```bash=
sudo docker run --rm -p 3000:3000 bkimminich/juice-shop
```

---
Откроем в браузере http://192.168.1.75:3000

---
## 1.5 Изучение запросов браузера к приложению и форме регистрации пользователей
Посмотрим процесс логина


----
Посмотрим процесс регистрации






----
Посмотрим процесс входа пользователя



----
И, например процесс добавления в корзину


---
## 1.6 Запрос к приложению через curl
На основе данных полученных в предыдущем разделе, составим запросы к сервису

Попробуем в лоб обратимся к сервису указав логин пароль
```bash=
curl -u mynewuser@prsecurity.com:mynewpassword http://192.168.1.75:3000/api/Basketitems/
```

---

Попробуем залогиниться
```bash=
curl -X POST http://192.168.1.75:3000/rest/user/login -H 'Content-Type: application/json' -d '{"email":"mynewuser@ptsecurity.com","password":"mynewpassword"}'
```

---
Используя jq спарсим токен
```bash=
curl -X POST http://192.168.1.75:3000/rest/user/login -H 'Content-Type: application/json' -d '{"email":"mynewuser@ptsecurity.com","password":"mynewpassword"}' | jq
```

---
Токен спарсили
```bash=
curl -X POST http://192.168.1.75:3000/rest/user/login -H 'Content-Type: application/json' -d '{"email":"mynewuser@ptsecurity.com","password":"mynewpassword"}' | jq -r .authentication.token
```

---
Положим токен в переменную
```bash=
TOKEN=$(curl -X POST http://192.168.1.75:3000/rest/user/login -H 'Content-Type: application/json' -d '{"email":"mynewuser@ptsecurity.com","password":"mynewpassword"}' | jq -r .authentication.token )
```

---
Обратимся к сервису используя токен
```bash=
curl -H 'Accept: application/json' -H "Authorization: Bearer $TOKEN" http://192.168.1.75:3000/rest/products/search
```

---
Распарсим ответ используя jq
```bash=
curl -H 'Accept: application/json' -H "Authorization: Bearer $TOKEN" http://192.168.1.75:3000/rest/products/search | jq
```

---
Выберем, например, только интересующие нас значения
```bash=
curl -H 'Accept: application/json' -H "Authorization: Bearer $TOKEN" http://192.168.1.75:3000/rest/products/search | jq '.data[] | {name, description}'
```

---
Обратимся к корзине
```bash=
curl -X PUT -H 'Accept: application/json' -H "Authorization: Bearer $TOKEN" http://192.168.1.75:3000/api/BasketItems/3 -d '{"quantity":"8"}'
```

---
Распарсим ответ
```bash=
curl -X PUT -H 'Accept: application/json' -H "Authorization: Bearer $TOKEN" http://192.168.1.75:3000/api/BasketItems/3 -d '{"quantity":"8"}' | jq
```

---
Поменяем адрес
```bash=
curl -X POST -H 'Accept: application/json' -H "Authorization: Bearer $TOKEN" http://192.168.1.75:3000/api/Addresss/ -H 'Content-Type: application/json' -d '{"city":"2sdfsd", "country":"russia", "fullName":"User", "mobileNum":"2222222222", "state":"msk", "streetAddress":"street", "zipCode":"123"}'
```

---
Ответ немного распарсим
```bash=
curl -X POST -H 'Accept: application/json' -H "Authorization: Bearer $TOKEN" http://192.168.1.75:3000/api/Addresss/ -H 'Content-Type: application/json' -d '{"city":"2sdfsd", "country":"russia", "fullName":"User", "mobileNum":"2222222222", "state":"msk", "streetAddress":"street", "zipCode":"123"}' | jq
```

---
Можем выбирать различные значения
```bash=
curl -X POST -H 'Accept: application/json' -H "Authorization: Bearer $TOKEN" http://192.168.1.75:3000/api/Addresss/ -H 'Content-Type: application/json' -d '{"city":"2sdfsd", "country":"russia", "fullName":"User", "mobileNum":"2222222222", "state":"msk", "streetAddress":"street", "zipCode":"123"}' | jq
curl -X POST -H 'Accept: application/json' -H "Authorization: Bearer $TOKEN" http://192.168.1.75:3000/api/Addresss/ -H 'Content-Type: application/json' -d '{"city":"2sdfsd", "country":"russia", "fullName":"User", "mobileNum":"2222222222", "state":"msk", "streetAddress":"street", "zipCode":"123"}' | jq .data[]
curl -X POST -H 'Accept: application/json' -H "Authorization: Bearer $TOKEN" http://192.168.1.75:3000/api/Addresss/ -H 'Content-Type: application/json' -d '{"city":"2sdfsd", "country":"russia", "fullName":"User", "mobileNum":"2222222222", "state":"msk", "streetAddress":"street", "zipCode":"123"}' | jq .data.city
curl -X POST -H 'Accept: application/json' -H "Authorization: Bearer $TOKEN" http://192.168.1.75:3000/api/Addresss/ -H 'Content-Type: application/json' -d '{"city":"2sdfsd", "country":"russia", "fullName":"User", "mobileNum":"2222222222", "state":"msk", "streetAddress":"street", "zipCode":"123"}' | jq .data.state
curl -X POST -H 'Accept: application/json' -H "Authorization: Bearer $TOKEN" http://192.168.1.75:3000/api/Addresss/ -H 'Content-Type: application/json' -d '{"city":"2sdfsd", "country":"russia", "fullName":"User", "mobileNum":"2222222222", "state":"msk", "streetAddress":"street", "zipCode":"123"}' | jq .data.streetAddress
```

---
## 1.7 Запрос к приложению через powershell
Powershell действуем аналогично curl
Создадим пользователя
```powershell=
$newuserJSON = @{"email"="usertwo@ptsecurity.com";"password"="verycoolpass";"passwordRepeat"="verycoolpass";"securityQuestion"=@{"id"=1;"question"="Your eldest siblings middle name?";"createdAt"="2022-09-08T19:54:51.352Z";"updatedAt"="2022-09-08T19:54:51.352Z"};"securityAnswer"="John"} | ConvertTo-Json
Invoke-WebRequest -Uri http://192.168.1.75:3000/api/Users/ -Method POST -Body $newuserJSON -ContentType "application/json"
```

---
Залогинимся под пользователем
```powershell=
$credJSON = @{"email"="usertwo@ptsecurity.com";"password"="verycoolpass"} | ConvertTo-Json
Invoke-WebRequest -Uri http://192.168.1.75:3000/rest/user/login -Method POST -Body $credJSON -ContentType "application/json"
```

---
```powershell=
$response = Invoke-WebRequest -Uri http://192.168.1.75:3000/rest/user/login -Method POST -Body $credJSON -ContentType "application/json"
$token = $response.Content.Split(":{").split(":").split(",").split('"')[7]
$token
```

---
Получим токен
```powershell=
$secureToken = $token | ConvertTo-SecureString -AsPlainText -Force
Invoke-WebRequest -Uri http://192.168.1.75:3000/rest/products/search -Authentication Bearer -Token $secureToken -AllowUnencryptedAuthentication
```

----
Используя токен обратимся, например, к корзине
```powershell=
Invoke-WebRequest -Uri http://192.168.1.75:3000/api/BasketItems/3 -Authentication Bearer -Token $secureToken -AllowUnencryptedAuthentication
```

---
Поменяем адрес
```powershell=
$address = @{"city"="msk";"country"="Russia";"fullName"="Vasya";"mobileNum"="2222222222";"state"="msk";"streetAddress"="street";"zipCode"="222"} | ConvertTo-Json
Invoke-WebRequest -Uri http://192.168.1.75:3000/api/Addresss/ -Authentication Bearer -Token $secureToken -AllowUnencryptedAuthentication -Method POST -Body $address
```

---
## 1.8 Изучение ответа приложения и его парсинг с помощью утилит jq
Утилиту jq использовали при составлении запросов к сервису через curl, тут приведем данные запросы отдельно.
```bash=
curl -X POST http://192.168.1.75:3000/rest/user/login -H 'Content-Type: application/json' -d '{"email":"mynewuser@ptsecurity.com","password":"mynewpassword"}' | jq
```

---
```bash=
curl -X POST http://192.168.1.75:3000/rest/user/login -H 'Content-Type: application/json' -d '{"email":"mynewuser@ptsecurity.com","password":"mynewpassword"}' | jq -r .authentication.token
```

---
```bash=
TOKEN=$(curl -X POST http://192.168.1.75:3000/rest/user/login -H 'Content-Type: application/json' -d '{"email":"mynewuser@ptsecurity.com","password":"mynewpassword"}' | jq -r .authentication.token )
```

---
```bash=
curl -H 'Accept: application/json' -H "Authorization: Bearer $TOKEN" http://192.168.1.75:3000/rest/products/search | jq
```

---
```bash=
curl -H 'Accept: application/json' -H "Authorization: Bearer $TOKEN" http://192.168.1.75:3000/rest/products/search | jq '.data[] | {name, description}'
```

---
```bash=
curl -X PUT -H 'Accept: application/json' -H "Authorization: Bearer $TOKEN" http://192.168.1.75:3000/api/BasketItems/3 -d '{"quantity":"8"}' | jq
```

---
```bash=
curl -X POST -H 'Accept: application/json' -H "Authorization: Bearer $TOKEN" http://192.168.1.75:3000/api/Addresss/ -H 'Content-Type: application/json' -d '{"city":"2sdfsd", "country":"russia", "fullName":"User", "mobileNum":"2222222222", "state":"msk", "streetAddress":"street", "zipCode":"123"}' | jq
```

---
```bash=
curl -X POST -H 'Accept: application/json' -H "Authorization: Bearer $TOKEN" http://192.168.1.75:3000/api/Addresss/ -H 'Content-Type: application/json' -d '{"city":"2sdfsd", "country":"russia", "fullName":"User", "mobileNum":"2222222222", "state":"msk", "streetAddress":"street", "zipCode":"123"}' | jq
curl -X POST -H 'Accept: application/json' -H "Authorization: Bearer $TOKEN" http://192.168.1.75:3000/api/Addresss/ -H 'Content-Type: application/json' -d '{"city":"2sdfsd", "country":"russia", "fullName":"User", "mobileNum":"2222222222", "state":"msk", "streetAddress":"street", "zipCode":"123"}' | jq .data[]
curl -X POST -H 'Accept: application/json' -H "Authorization: Bearer $TOKEN" http://192.168.1.75:3000/api/Addresss/ -H 'Content-Type: application/json' -d '{"city":"2sdfsd", "country":"russia", "fullName":"User", "mobileNum":"2222222222", "state":"msk", "streetAddress":"street", "zipCode":"123"}' | jq .data.city
curl -X POST -H 'Accept: application/json' -H "Authorization: Bearer $TOKEN" http://192.168.1.75:3000/api/Addresss/ -H 'Content-Type: application/json' -d '{"city":"2sdfsd", "country":"russia", "fullName":"User", "mobileNum":"2222222222", "state":"msk", "streetAddress":"street", "zipCode":"123"}' | jq .data.state
curl -X POST -H 'Accept: application/json' -H "Authorization: Bearer $TOKEN" http://192.168.1.75:3000/api/Addresss/ -H 'Content-Type: application/json' -d '{"city":"2sdfsd", "country":"russia", "fullName":"User", "mobileNum":"2222222222", "state":"msk", "streetAddress":"street", "zipCode":"123"}' | jq .data.streetAddress
```

---