Public/Request-NicRuToken.ps1
<#
.SYNOPSIS Request refresh and access tokens from nic.ru api Need to register own api app on https://www.nic.ru/manager/oauth.cgi?step=oauth.app_list .DESCRIPTION Запрос на получение токена по логину и паролю или по предыдущему refresh-токену Требуется регистрация собственного "приложения" https://www.nic.ru/manager/oauth.cgi?step=oauth.app_list .PARAMETER Client_Id Application client_id .PARAMETER Client_Secret Application client_secret in SecureString form .PARAMETER Client_Credential Application client_id+client_secret in PSCredential form .PARAMETER Scope Access scope (for examples see Notes) scope это список в формате <method>:<url путь> <method>:<url путь> <method>:<url путь>. Элементы списка разделены пробелами. Методы (<method>), определяющие права доступа к заданной области и <url путь>, определяющий область доступа, разделены двоеточием. Параметр <method> может принимать следующие значения: GET – доступ к чтению (получению) данных; PUT – доступ к размещению данных; POST – доступ к изменению данных; DELETE – доступ к удалению размещенных данных или может быть задан регулярным выражением, например: GET|POST – доступ к чтению и изменению данных; GET|PUT – доступ к чтению и размещению данных; GET|PUT|DELETE – доступ к чтению, размещению и удалению размещенных данных; GET|POST|DELETE – доступ к чтению, изменению и удалению размещенных данных; .+ – полный доступ Параметр <url путь> задается регулярным выражением с ограничением на использование символов ^ и $ и без указания домена и протокола (https://api.nic.ru). Для DNS-хостинга всегда начинается с /dns-master/: /dns-master/.+ для разрешения доступа ко всем услугам DNS-хостинга; /dns-master/zones/<zone>(/.+)? для разрешения доступа к конкретной зоне <zone>; /dns-master/services/<service>(/.+)? для разрешения доступа к конкретной услуге <service>; /dns-master/services/<service>/zones/<zone>(/.+)? для разрешения доступа к конкретной зоне <zone> на конкретной услуге <service> .PARAMETER Username Client username in xxx/NIC-D form .PARAMETER Password Client password (may be administrative or technical) .PARAMETER Credential Client username+password in PSCredential form (may be administrative or technical) .PARAMETER RefreshToken Refresh token (for refresh access token) .OUTPUTS Object with refresh_token/access_token to use The last received access token is stored in the module for future use .EXAMPLE $username = '12345/NIC-D' $password = 'Pa$sw0rd' | ConvertTo-SecureString -AsPlainText $t = Request-NicRuToken -Client_id cid23424234 -Client_Secret cis2342423 -Username $username -Password $password Get-NicRuDnsService -AccessToken $t.access_token .EXAMPLE # Ask for user/password $cred = Get-Credential '12345/NIC-D' # Ask for client_id/client_secret $cli_cred = Get-Credetial 'cid23424234' # Request access to zone test.ru Request-NicRuToken -Client_Credential $cli_cred -Credential $cred -Scope '/dns-master/zones/org.ru(/.+)?' # Get entry using last received access token stored internally after Request-NicRuToken Get-NicRuDnsRecord -Service 'PRST-ORG-RU' -ZoneName 'org.ru' -RecordName 'test' .EXAMPLE $t = Request-NicRuToken -Client_id cid23424234 -Client_Secret cis2342423 -RefreshToken ($t.refresh_token | ConvertTo-SecureString -AsPlainText) # The last received access token is stored inside the module for future use, so Access token not required Get-NicRuDnsService .LINK https://www.nic.ru/manager/oauth.cgi?step=oauth.app_list .LINK https://www.nic.ru/help/oauth-server_3642.html https://www.nic.ru/help/upload/file/API_DNS-hosting.pdf .NOTES Scopes: • scope=GET:/dns-master/.+ ограничение только на чтение данных по всем услугам DNS-хостинга на договоре; • scope=POST:/dns-master/.+ доступ на изменение данных ко всем услугам DNS-хостинга на договоре; • scope=(GET|PUT):/dns-master/services/<service>/.+ доступ на чтение и размещение данных к конкретной услуге <service>; • scope=PUT:/dns-master/services/<service>/zones/<zone1>(/.+)? POST:/dns-master/services/<service>/zones/<zone2>(/.+)? доступ на размещение данных к зоне <zone1> и на редактирование к зоне <zone2>, находящихся на услуге <service>. Элементы списка в параметре scope (PUT:/dns-master/services/<service>/zones/<zone1>(/.+)? и POST:/dnsmaster/services/<service>/zones/<zone2>(/.+)?) разделены пробелом; • scope=(GET|POST|DELETE):/dns-master/services/<service>/zones/<zone>(/.+)? доступ на чтение, изменение и удаление данных к зоне <zone>, находящейся на услуге <service>; • scope=GET:/dns-master/services/<service>/.+ ограничение только на чтение к услуге <service>; • scope=GET:/dns-master/services/<service1>/zones/<zone1>(/.+)? PUT:/dns-master/services/<service2>/zones/<zone2>(/.+)? (POST|DELETE):/dns-master/services/<service3>/zones/<zone3>(/.+)? доступ на чтение к зоне <zone1>, находящейся на услуге <service1>, разрешения доступа на добавление данных к зоне <zone2>, находящейся на услуге <service2>, и разрешения доступа на редактирование и удаление данных к зоне <zone3>, находящейся на услуге <service3>. Элементы списка в параметре scope (GET:/dns-master/services/<service1>/zones/<zone1>(/.+)?, PUT:/dns-master/services/<service2>/zones/<zone2>(/.+)? и (POST|DELETE):/dnsmaster/services/<service2>/zones/<zone2>(/.+)?) разделены пробелами; • scope=POST:.+/zones/<zone>(/.+)? доступ на редактирование к зоне <zone>; • PUT:/dns-master/services/service/.+ доступ на добавление данных к конкретной услуге <service>; • scope=.+:/dns-master/.+ полный доступ ко всем услугам DNS-хостинга на договоре. #> function Request-NicRuToken { [CmdletBinding()] param( [Parameter(Mandatory, ParameterSetName='iu')] [Parameter(Mandatory, ParameterSetName='ic')] [Parameter(Mandatory, ParameterSetName='ir')] [string]$Client_Id, [Parameter(Mandatory, ParameterSetName='iu')] [Parameter(Mandatory, ParameterSetName='ic')] [Parameter(Mandatory, ParameterSetName='ir')] [securestring]$Client_Secret, [Parameter(Mandatory, ParameterSetName='cu')] [Parameter(Mandatory, ParameterSetName='cc')] [Parameter(Mandatory, ParameterSetName='cr')] [pscredential]$Client_Credential, [string]$Scope = '.+', [Parameter(Mandatory, ParameterSetName='iu')] [Parameter(Mandatory, ParameterSetName='cu')] [string]$Username, [Parameter(Mandatory, ParameterSetName='iu')] [Parameter(Mandatory, ParameterSetName='cu')] [securestring]$Password, [Parameter(Mandatory, ParameterSetName='ic')] [Parameter(Mandatory, ParameterSetName='cc')] [pscredential]$Credential, [Parameter(Mandatory, ParameterSetName='ir')] [Parameter(Mandatory, ParameterSetName='cr')] [securestring]$RefreshToken ) if ($PSCmdlet.ParameterSetName -in 'iu', 'ic', 'ir') { $credentials = New-Object System.Management.Automation.PSCredential $Client_Id, $Client_Secret } else { $credentials = $Client_Credential } if ($PSCmdlet.ParameterSetName -in 'ir', 'cr') { $c = New-Object System.Management.Automation.PSCredential @('t', $RefreshToken) $body = @{ grant_type = 'refresh_token' refresh_token = $c.GetNetworkCredential().Password } } else { if ($PSCmdlet.ParameterSetName -in 'ic', 'cc') { $Password = $Credential.Password $Username = $Credential.UserName } $c = New-Object System.Management.Automation.PSCredential @('t', $Password) $body = @{ offline = 1 grant_type = 'password' scope = $Scope username = $Username password = $c.GetNetworkCredential().Password } } $requestParams = @{ Uri = "https://api.nic.ru/oauth/token" Headers = $Headers ContentType = "application/json; charset=utf-8" Body = $body UseBasicParsing = $true } if ($PSVersionTable.PSVersion.Major -lt 7) { # legacy powershell authorization workaround $requestParams.Headers = @{ Authorization = 'Basic ' + [Convert]::ToBase64String([System.Text.Encoding]::Utf8.GetBytes($credentials.UserName + ':' + $credentials.GetNetworkCredential().Password)) } $requestParams.Use } else { $requestParams.Authentication = 'Basic' $requestParams.Credential = $credentials } Write-Verbose $requestParams.Uri Invoke-RestMethod -Method Post @requestParams @GMNicRuProxySettings | Tee-Object -Variable token #save default $GMNicRuDefaultToken.refresh_token = $token.refresh_token $GMNicRuDefaultToken.expires_in = $token.expires_in $GMNicRuDefaultToken.access_token = $token.access_token $GMNicRuDefaultToken.token_type = $token.token_type } |