# Проект "база". Авторизация на сервере (Basic auth, token). ## API Приведу пример описания API, которое было на моём демо-экзамене: >API доступно по адресу http://car.areas.su/ >Для работы с API метод принимает в теле application/json >Например: >Метод входа. Ссылка http://cars.areas.su/login > >Request Body(application/json) >```json >{ > "username":"serk", > "password":"123" >} >``` > >Response > >```json >{ > "notice": > { > "token":111520 > } >} >``` > >1 **/login** – метод для получения ключа для входа > - Используется метод POST > - Формат запроса JSON > - Принимает два ключа username и password > - ответ в формате JSON > >2 **/logout** – метод обнуления действия token > - Используется метод POST > - Формат запроса JSON > - Принимает ключ username > >3 **/signup** – метод регистрации нового пользователя > - Используется метод POST > - Формат запроса JSON > - Принимает ключ username, email, password > >4 **/cars** – метод для получения свободных автомобилей > - Используется метод GET > - Формат ответа JSON > >5 **/history** – метод для получения истории вождения > - Используется метод POST > - Формат запроса JSON > - **Принимает ключ token** > - Формат ответа JSON Несколько косноязычно и не расписаны "подводные камни". Логика авторизации такая, что если токен уже получен, то новый не выдается - нужно сначала разлогиниться. Методы есть как публичные (**/cars**), так и требующие авторизации (**/history** - это видно по тому, что в параметрах требуется токен). Я на примере этого разработал АПИ для ваших баз: 1. Создаем файл `api.http`: >Примеры запросов реализованы в формате плагина **REST Client** для Visual Studio Code Прописываем в нем URL сервера: ``` @url=http://s4a.kolei.ru ``` 2. Проверить работоспособность можно послав запрос **/about**: ``` GET {{url}}/about ``` 3. Для авторизации нужно послать **POST** запрос **/login** в формате `application/json` с параметрами *username* и *password* (соответственно логин и пароль к ВАШЕЙ базе MySQL) ``` ### логин # @name login POST {{url}}/login Content-Type: application/json { "username": "esmirnov", "password": "111103" } ### @token={{login.response.body.$.notice.token}} ``` Тут встречаются средства автоматизации **REST Client**-а: * `# @name login` этой командой мы присваиваем имя текущему запросу * `@token={{login.response.body.$.notice.token}}` а здесь, используя ответ команды достаём токен. Таким образом для последующих команд не надо выписывать на бумажке токен и править запросы. При успешном ответе придет токен авторизации: ```json { "notice": { "token": 2200743 } } ``` При ошибке текст ошибки в поле *answer*: ```json { "notice": { "answer": "Пользователь уже авторизован, используйте токен или перелогиньтесь" } } ``` То есть при получении ответа вы должны разобрать полученный JSON, если есть токен, то можно продолжать работать. Если ошибка, то показать **Alert** с ошибкой и остаться на экране авторизации. 4. Для выхода нужно послать **POST** запрос **/logout** c параметом *username*: ``` POST {{url}}/logout Content-Type: application/json { "username": "esmirnov" } ``` 5. Для запроса данных из базы нужно послать **GET** запрос с названием таблицы. В заголовке запроса передать токен полученный при авторизации (я сначала сделал передачу токена в заголовке, а только потом увидел, что надо было передавать в теле запроса). ``` GET {{url}}/Product Content-Type: application/json Token: {{token}} ``` В ответ должны получить содержимое таблицы: ```json { "notice": { "data": [ { "ID": 1, "Title": "Колесо R18 Кованый", "ProductTypeID": 128, "ArticleNumber": "241659", "Description": null, "Image": "\\products\\tire_15.jpg", "ProductionPersonCount": 4, "ProductionWorkshopNumber": 10, "MinCostForAgent": 11509 }, ... ] } } ``` 6. Для получения изображений нужно выделить его название из поля *Image* и сформировать **GET** запрос: ``` GET {{url}}/img/tire_0.jpg ```