classes/TssSession.class.ps1
class TssSession { [string]$SecretServer [string]$ApiVersion = 'api/v1' hidden [string]$WindowsAuth = 'winauthwebservices' [string]$ApiUrl [string]$AccessToken [string]$RefreshToken [string]$TokenType hidden [datetime]$StartTime [int]$ExpiresIn hidden [datetime]$TimeOfDeath [int]$Take = [int]::MaxValue [boolean]IsValidSession() { if ([string]::IsNullOrEmpty($this.AccessToken) -and $this.StartTime -eq '0001-01-01 00:00:00') { return $false } elseif ($this.TokenType -in ('WindowsAuth','SdkClient')) { return $true } else { return $true } } [boolean]IsValidToken() { if ([string]::IsNullOrEmpty($this.AccessToken)) { Write-Warning 'No valid token found for current TssSession object' return $false } elseif ([datetime]::Now -lt $this.TimeOfDeath -and ($this.TokenType -notin ('ExternalToken','SdkClient'))) { return $true } elseif ([datetime]::Now -gt $this.TimeOfDeath -and ($this.TokenType -notin ('ExternalToken','SdkClient'))) { Write-Warning 'Token is not valid and has exceeded TimeOfDeath' return $false } elseif ($this.TokenType -eq 'ExternalToken') { Write-Warning 'Token was provided through external source, unable to validate' return $true } elseif ($this.TokenType -in ('WindowsAuth','SdkClient')) { Write-Verbose "$($this.TokenType) being used, no validation required" return $true } else { return $true } } [boolean]SessionExpire() { $url = $this.ApiUrl, 'oauth-expiration' -join '/' try { if ($this.TokenType -notin ('WindowsAuth','SdkClient')) { Invoke-TssRestApi -Uri $url -Method Post -PersonalAccessToken $this.AccessToken return $true } else { Write-Warning "$($this.TokenType) being used, SessionExpire is not required" return $false } } catch { return $false } } [boolean]SessionRefresh() { if ($this.TokenType -eq 'ExternalToken') { Write-Warning 'Token was provided through external source, SessionRefresh is not supported' return $false } if ($this.TokenType -in ('WindowsAuth','SdkClient')) { Write-Warning "$($this.TokenType) being used, SessionRefresh is not supported or required" return $false } try { $url = $this.SecretServer + 'oauth2/token' -join '/' $body = @{ refresh_token = $this.RefreshToken grant_type = 'refresh_token' } $response = Invoke-TssRestApi -Uri $url -Method Post -Body $body -ErrorAction Stop $this.AccessToken = $response.access_token $this.RefreshToken = $response.refresh_token $this.ExpiresIn = $response.expires_in $this.TokenType = $response.token_type $this.StartTime = [datetime]::Now $this.TimeOfDeath = [datetime]::Now.Add([timespan]::FromSeconds($response.expires_in)) return $true } catch { throw $_ } } } |