Страницы

воскресенье, 15 июня 2014 г.

Авторизация с помощью аккаунта Google на PowerShell

Способы авторизации, рассмотренные далее, могут пригодиться если к примеру необходимо периодически отправлять какие-нибудь данные, либо просто напоминать о себе для того, чтобы преодолеть квоту на общее время выполнения триггеров, из операционной системы Windows в адрес скрипта Google Apps Script, развернутого в качестве веб-приложения таким образом, что доступ к приложению имеет только владелец ("Кто имеет доступ к приложению" - "Только я").

Для начала дисклеймер: если у вас включена двухфакторная авторизация или иные подобные параноидальные свистелки, приведенный ниже код может не прокатить.

Метод обоих вариантов заключается в следующем: заполняем форму и получаем сессию. Все просто. 

Вариант #1:
$url = 'https://script.google.com/macros/s/AKfycbyKvED90DogevP_vBIbTnwQOp2f6kD-MhBgDOYAcl8o6WZDKT97/exec'
$timeout = 10
$email = 'mymail@gmail.com'
$pass = 'mypass'

$auth = Invoke-WebRequest -Uri $url -TimeoutSec $timeout -SessionVariable session  
$form = $auth.Forms[0]  
$form.Fields['Email'] = $email
$form.Fields['Passwd'] = $pass
$res = Invoke-WebRequest -Uri $form.Action -WebSession $session -Method POST -Body $form.Fields

if ($res.StatusCode -eq 200) {
  Write-Host $res.Content
}  

Но иногда вместо формы с полями для логина-пароля Google подсовывает... не помню как называется, короче форму для выбора аккаунта (кто вспомнил как эта хрень правильно называется - пишите в комменты плиз). Поэтому желательно сразу же авторизоваться с помощью формы с полями, после чего уже уверенно отправлять запросы в адрес скрипта.

Вариант #2:
$authUri = 'https://accounts.google.com/ServiceLoginAuth'
$gasUri = 'https://script.google.com/macros/s/AKfycbyKvED90DogevP_vBIbTnwQOp2f6kD-MhBgDOYAcl8o6WZDKT97/exec'
$timeout = 10
$email = 'mymail@gmail.com'
$pass = 'mypass'

try {
  $auth = Invoke-WebRequest -Uri $authUri -TimeoutSec $timeout -SessionVariable session
  $form = $auth.Forms[0]
  $form.Fields['Email'] = $email
  $form.Fields['Passwd'] = $pass
  Invoke-WebRequest -Uri $form.Action -TimeoutSec $timeout -WebSession $session -Method Post -Body $form.Fields | Out-Null
} catch {
  Write-Host 'Authentication error!'
  exit
}

$res = Invoke-WebRequest -Uri $gasUri -TimeoutSec $timeout -WebSession $session
if ($res.StatusCode -eq 200) {
  Write-Host $res.Content
} 

Вот как-то так.