Рубрики: PowerShell

Windows Powershell – Регистрация пользователя через API

PowerShellPowerShellСегодня мы рассмотрим кастомный скрипт и кастомную задачу средствами Powershell – Регистрация пользователя через API. Как уже неоднократно было сказано Powershell имеет весьма широкое применение. Давайте разбираться.

Windows Powershell – Регистрация пользователя через API

Как уже говорилось ранее, Powershell можно использовать практически везде. Все дело в том, что он многое умеет и на многое способен. И плюс ко всему технический склад ума обязателен поэтому уровень этой статьи выше, чем начинающий тестировщик/разработчик/devops/админ. Не будем ходить вокруг да около, опишу ситуацию:

Есть автотесты, которые выполняют определенные сценарии. Соответственно эти тесты ходят по различным вкладкам веб-приложения и тестируют функционал. Но для того, чтобы все это реализовать необходим пользователь. Руководством было принято решение при каждом деплое автотестового контура дропать бд, что автоматом выпиливало любого зарегистрированного ранее пользователя. Сначала было принято решение об обычном insert скрипте, который заносил бы во все необходимые таблицы данные о пользователе. Но ни разработчики, ни тестировщики не смогли реализовать сиквельный скрипт. К слову, продукт большой, имеет множество интеграций с другими продуктами внутри компании. Из двух девопсеров, задачка пала на меня.

Я стал размышлять, как проще это реализовать, и… Powershell + API. Меня почему-то не смутила трехфакторная регистрация. Я сразу был уверен, что смогу это реализовать. В итоге компиляция всех имеющихся навыков и представлений привела к рождению следующего скрипта:

#Declare reg data#
$body = '{
  "email": "email@domain.ru",
  "password": "123456",
  "confirmPassword": "123456",
  "emailChecked": true
}'
$regUri = 'http://server.domain.loc/api/account/registration'
$conType = 'application/json'
$method = 'put'

#Invoke first registration method#
$json = (Invoke-WebRequest -Uri $regUri -Method $method -ContentType $conType -Body $body).Content | ConvertFrom-Json | Select-Object -Expand data

#Parsing confirmation code and email, declare confirmation body#
$confirmCode = $json.code
$emailFromBody = ($body | ConvertFrom-Json).email
$confirmBody = @{
    email = $emailFromBody
    code = $confirmCode
}

#Declare confirmation url#
$confirmationUri = 'http://server.domain.loc/api/account/checkCode/' + $emailFromBody + '/' + $confirmCode

#Invoke confirmation method and getAccountInfo#
$getAccountInfo = (Invoke-WebRequest -Uri $confirmationUri -Method post -ContentType $conType -Body $confirmBody)

if ($getAccountInfo.RawContent.Contains("Content-Type: application/json; charset=utf-8")) {

    $parseAccInfo = $getAccountInfo.Content | ConvertFrom-Json | Select -Expand data

    #Agregate and save account info#
    $accountId = $parseAccInfo.account
    $confirmationId = $parseAccInfo.confirmation
    $orgShortName = "ГАЗПРОМ"

    <#Add big user data and finish registration#>
    $bigData = @{
        organization = @{
            orgShortName = "ПАО " + '"' + $orgShortName + '"'
            legalAddress = @{
                fiasId = ""
                city = "Москва"
                street = "Наметкина"
                house = "16"
                postCode = "117420"
                regionCode = "77"
                region = "Москва"
                isCityRegion = "true"
            }
            postAddress = @{
                fiasId = ""
                city = "Москва"
                street = "Наметкина"
                house = "16"
                postCode = "117420"
                regionCode = "77"
                region = "Москва"
                isCityRegion = "true"
            }
            factAddress = @{
                fiasId = ""
                city = "Москва"
                street = "Наметкина"
                house = "16"
                postCode = "117420"
                regionCode = "77"
                region = "Москва"
                isCityRegion = "true"
            }
            consignee = "ПАО " + '"' + $orgShortName + '"'
            inn = "1234567890"
            kpp = "123456789"
            orgName = "ПУБЛИЧНОЕ АКЦИОНЕРНОЕ ОБЩЕСТВО ГАЗПРОМ"
            accountId = $accountId
            cabinetId = 14
        }
        boss = @{
            firstName = "АЛЕКСЕЙ"
            lastName = "МИЛЛЕР"
            middleName = "БОРИСОВИЧ"
            phoneNumber = "9293333333"
            email = $emailFromBody
            dept = "ПРЕДСЕДАТЕЛЬ ПРАВЛЕНИЯ"
            phoneAdd = "null"
        }
        isContactMatchToBoss = "true"
        companyContact = @{
            firstName = "АЛЕКСЕЙ"
            lastName = "МИЛЛЕР"
            middleName = "БОРИСОВИЧ"
            phoneNumber = "9293333333"
            email = $emailFromBody
            dept = "ПРЕДСЕДАТЕЛЬ ПРАВЛЕНИЯ"
            phoneAdd = "null"
        }
        isSuccess = "true"
        confirmation = $confirmationId
        postAddress = @{
            fiasId = ""
            city = "Москва"
            street = "Наметкина"
            house = "16"
            postCode = "117420"
            regionCode = "77"
            region = "Москва"
            isCityRegion = "true"
        }
        factAddress = @{
            fiasId = ""
            city = "Москва"
            street = "Наметкина"
            house = "16"
            postCode = "117420"
            regionCode = "77"
            region = "Москва"
            isCityRegion = "true"
        }
        legalAddress = @{
            fiasId = ""
            city = "Москва"
            street = "Наметкина"
            house = "16"
            postCode = "117420"
            regionCode = "77"
            region = "Москва"
            isCityRegion = "true"
        }
        confirmationData = @{
            account = $accountId
            confirmation = $confirmationId
            accountId = 0
            email = $emailFromBody
            confirmationCode = $confirmCode
            inn = "1234567890"
        }
        companyViewModel = @{
            isCompany = "true"
            inn = "1234567890"
            kpp = "123456789"
            ogrn = "1234567890123"
            ogrNip = "1234567890123"
            companyShortName = "ПАО " + '"' + $orgShortName + '"'
            companyFullName = "ПУБЛИЧНОЕ АКЦИОНЕРНОЕ ОБЩЕСТВО ГАЗПРОМ"
            consignee = "ПАО " + '"' + $orgShortName + '"'
            phoneNumber = "9293333333"
        }
    }

    $jsonBigData = $bigData | ConvertTo-Json

    #Declare confirmation url#
    $finishRegUrl = 'http://server.domain.loc/api/account/confirmation'

    #Invoke-WebRequest with user data#
    Invoke-WebRequest -Uri $finishRegUrl -Method post -ContentType $conType -Body ([Text.Encoding]::UTF8.GetBytes($jsonBigData))
    Write-Host "Registration successful!"
}
else {
    Write-Host "Abonent is already register."
}

Фух. Давайте по порядку.

Шаг первый – заявка на регистрацию

  1. Пойдем по шагам регистрации, отправка запроса на регистрацию. За нее отвечает этот кусок:
#Declare reg data#
$body = '{
  "email": "email@domain.ru",
  "password": "123456",
  "confirmPassword": "123456",
  "emailChecked": true
}'
$regUri = 'http://server.domain.loc/api/account/registration'
$conType = 'application/json'
$method = 'put'

#Invoke first registration method#
$json = (Invoke-WebRequest -Uri $regUri -Method $method -ContentType $conType -Body $body).Content | ConvertFrom-Json | Select-Object -Expand data

$body – записываем json, в котором записаны первичные данные нового пользователя.
$regUri – адрес, к которому обратимся.
$conType – не обязательно, записываем в каком формате будет подача данных для метода.
$method – не обязательно, записываем тип метода, который хотим использовать.

$json – Сюда прописываем целую итерацию. Первая часть:

Invoke-WebRequest -Uri $regUri -Method $method -ContentType $conType -Body $body).Content – в этой строке мы обращаемся к методу, который указан у нас в переменной $regUri, сообщаем что используется метод put и тип контента json, и передаем тело запроса из переменной $body. При этом нас интересует только конкретная часть возвращаемого ответа. Поэтому мы весь запрос поместили в скобки и вытаскиваем из него только часть Content. В результате получаем такой ответ:

code : 6252
accountId : e7bd00cb-d2a2-4a0c-8f6c-24d8f4edd1ea
confirmationId : c134d363-15e6-4d87-9964-bdf9568c2c09
redirectUrl :
isUserExists : False
isWrongPassword : False
result : 0

Это уже обработанные данные, которые в далее мы применим на методе, который является вторым этапом регистрации пользователя.

Шаг второй – подтверждение регистрации

Необходимо сэмулировать ввод кода подтверждения. Сконфигурируем новый боди, а так же заберем email из прошлого body. Так же запишем код, строкой: $confirmCode = $json.code. Запишем необходимый нам адрес строкой:

$confirmationUri = ‘http://server.domain.loc/api/account/checkCode/’ + $emailFromBody + ‘/’ + $confirmCode

Как видите ссылка складывает из строки и двух переменных, собственно весь этот кусок выглядит так:

#Parsing confirmation code and email, declare confirmation body#
$confirmCode = $json.code
$emailFromBody = ($body | ConvertFrom-Json).email
$confirmBody = @{
 email = $emailFromBody
 code = $confirmCode
}

#Declare confirmation url#
$confirmationUri = 'http://server.domain.loc/api/account/checkCode/' + $emailFromBody + '/' + $confirmCode

#Invoke confirmation method and getAccountInfo#
$getAccountInfo = (Invoke-WebRequest -Uri $confirmationUri -Method post -ContentType $conType -Body $confirmBody)

В $getAccountInfo – мы получили ответ от сервера, но он нам нужен не весь, плюс ко всему пора начинать вводить условие, зарегистрирован юзер уже или нет. Далее алгоритм такой – парсим нужные данные в нашем случае это снова Content. Расконвертируем их из json и выберем только компонент data. Таким образом мы сможем обратиться к отдельным элементам ответа, которые рассортированы по своим полям. Далее условие… Есть один единственный нюанс – если пользователь зарегистрирован, то ответ будет отличным от типа данных json. Соответственно на это и делаем проверку. Кодом:

#Invoke confirmation method and getAccountInfo#
$getAccountInfo = (Invoke-WebRequest -Uri $confirmationUri -Method post -ContentType $conType -Body $confirmBody)

if ($getAccountInfo.RawContent.Contains("Content-Type: application/json; charset=utf-8")) {

$parseAccInfo = $getAccountInfo.Content | ConvertFrom-Json | Select -Expand data

#Agregate and save account info#
$accountId = $parseAccInfo.account
$confirmationId = $parseAccInfo.confirmation

Шаг третий – ввод данных пользователя

Окей, далее идет большой-большой json – объект, который необходимо отправлять чистым json. Но есть еще переменные, которые нам обязательно надо подставлять в json, иначе данные будут некорректны и мы не сможем пройти регистрацию. В объекте представлены ненастоящие данные:

$orgShortName = "ГАЗПРОМ"

    <#Add big user data and finish registration#>
    $bigData = @{
        organization = @{
            orgShortName = "ПАО " + '"' + $orgShortName + '"'
            legalAddress = @{
                fiasId = ""
                city = "Москва"
                street = "Наметкина"
                house = "16"
                postCode = "117420"
                regionCode = "77"
                region = "Москва"
                isCityRegion = "true"
            }
            postAddress = @{
                fiasId = ""
                city = "Москва"
                street = "Наметкина"
                house = "16"
                postCode = "117420"
                regionCode = "77"
                region = "Москва"
                isCityRegion = "true"
            }
            factAddress = @{
                fiasId = ""
                city = "Москва"
                street = "Наметкина"
                house = "16"
                postCode = "117420"
                regionCode = "77"
                region = "Москва"
                isCityRegion = "true"
            }
            consignee = "ПАО " + '"' + $orgShortName + '"'
            inn = "1234567890"
            kpp = "1234567890"
            orgName = "ПУБЛИЧНОЕ АКЦИОНЕРНОЕ ОБЩЕСТВО ГАЗПРОМ"
            accountId = $accountId
            cabinetId = 14
        }
        boss = @{
            firstName = "АЛЕКСЕЙ"
            lastName = "МИЛЛЕР"
            middleName = "БОРИСОВИЧ"
            phoneNumber = "9293333333"
            email = $emailFromBody
            dept = "ПРЕДСЕДАТЕЛЬ ПРАВЛЕНИЯ"
            phoneAdd = "null"
        }
        isContactMatchToBoss = "true"
        companyContact = @{
            firstName = "АЛЕКСЕЙ"
            lastName = "МИЛЛЕР"
            middleName = "БОРИСОВИЧ"
            phoneNumber = "9293333333"
            email = $emailFromBody
            dept = "ПРЕДСЕДАТЕЛЬ ПРАВЛЕНИЯ"
            phoneAdd = "null"
        }
        isSuccess = "true"
        confirmation = $confirmationId
        postAddress = @{
            fiasId = ""
            city = "Москва"
            street = "Наметкина"
            house = "16"
            postCode = "117420"
            regionCode = "77"
            region = "Москва"
            isCityRegion = "true"
        }
        factAddress = @{
            fiasId = ""
            city = "Москва"
            street = "Наметкина"
            house = "16"
            postCode = "117420"
            regionCode = "77"
            region = "Москва"
            isCityRegion = "true"
        }
        legalAddress = @{
            fiasId = ""
            city = "Москва"
            street = "Наметкина"
            house = "16"
            postCode = "117420"
            regionCode = "77"
            region = "Москва"
            isCityRegion = "true"
        }
        confirmationData = @{
            account = $accountId
            confirmation = $confirmationId
            accountId = 0
            email = $emailFromBody
            confirmationCode = $confirmCode
            inn = "1234567890"
        }
        companyViewModel = @{
            isCompany = "true"
            inn = "1234567890"
            kpp = "1234567890"
            ogrn = "1234567890"
            ogrNip = "1234567890"
            companyShortName = "ПАО " + '"' + $orgShortName + '"'
            companyFullName = "ПУБЛИЧНОЕ АКЦИОНЕРНОЕ ОБЩЕСТВО ГАЗПРОМ"
            consignee = "ПАО " + '"' + $orgShortName + '"'
            phoneNumber = "9293333333"
        }
    }

    $jsonBigData = $bigData | ConvertTo-Json

Последняя строка преобразует объект в правильный json и пишет результат в переменную. Далее забиваем адрес последнего этапа регистрации в переменную $finishRegUrl, и вызываем напрямую метод обращения к api:

#Declare confirmation url#
    $finishRegUrl = 'http://korriban.tst.loc/api/account/confirmation'

    #Invoke-WebRequest with user data#
    Invoke-WebRequest -Uri $finishRegUrl -Method post -ContentType $conType -Body ([Text.Encoding]::UTF8.GetBytes($jsonBigData))
    Write-Host "Registration successful!"
}
else {
    Write-Host "Abonent is already register."
}

В блоке else нам выведется сообщение, если пользователь зарегистрирован. Если у вас остались вопросы – комменты открыты! Скрипт берите, пользуйте, адаптируйте под свои нужды. Спасибо за внимание и помните о нашем канале и группе в вк!

0

Автор публикации

не в сети 1 час

Vapi

0
Комментарии: 19Публикации: 104Регистрация: 14-04-2017
Vapi

Посмотреть комментарии

Поделиться
Опубликовал
Vapi

Новаястатья

SQL – получаем активные соединения

Добрый день. В этой статье мы с вами научимся писать запросы, которые выводят активные соединения…

2 недели назад

Готовые шаблоны/шапки YouTube PSD #5

Здравствуйте, уважаемые читатели! Было принято решение 12 числа каждого месяца специально для вас делать ежемесячный…

2 недели назад

HTML – IMG

Всем привет дорогие читатели. В этом посте мы с вами узнаем как вставить картинку в…

2 недели назад

CSS – Отступы

Сегодня мы поговорим про отступы в CSS. В предыдущих статьях неоднократно они использовались для примеров,…

2 недели назад

JavaScript – меняем CSS

Немного отойдем от изучения powershell и добавим JavaScript. Сегодня мы научимся менять CSS на странице…

2 недели назад

Powershell – Операторы сравнения

Уже неоднократно в наших статьях встречались операторы сравнения, например, когда мы разбирали Where-Object. В этой…

2 недели назад
Авторизация
*
*

Login form protected by Login LockDown.


Регистрация
*
*
*
Пароль не введен
Генерация пароля