android_auth.md 6.2 KB

Проект "база". Авторизация на сервере (Basic auth, token).

API

Приведу пример описания API, которое было на моём демо-экзамене:

API доступно по адресу http://car.areas.su/ Для работы с API метод принимает в теле application/json Например: Метод входа. Ссылка http://cars.areas.su/login

Request Body(application/json)

{
  "username":"serk",
  "password":"123"
}

Response

{
  "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}} а здесь, используя ответ команды достаём токен. Таким образом для последующих команд не надо выписывать на бумажке токен и править запросы.

    При успешном ответе придет токен авторизации:

    {
        "notice": {
            "token": 2200743
        }
    }
    

    При ошибке текст ошибки в поле answer:

    {
        "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}}
    

    В ответ должны получить содержимое таблицы:

    {
        "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