MuhammadSannan
MuhammadSannan

Reputation: 109

Getting 401 unauthorized when trying to transition Jira tickets using powershell tickets

I'm using Powershell script shown below, It's giving me 401 unauthorized when trying to login my user have all permission. Secondly for password i'm using API Token generated from jira profile. not sure what is the problem? i've tried all of following scenarios (1) user name and password (2) user name and API Token (3) user email and API Token but still no success. we are using Jira server does that change anything? I'm getting 401 unauthorized

[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls -bor [Net.SecurityProtocolType]::Tls11 -bor [Net.SecurityProtocolType]::Tls12

$Uri = 'https://jira-url/jira'
$Jql = 'key in (WCOR-5419)'
$Transition = 'Deployed'
$User = 'muhammad.sannan'
$Password = 'API-Token from Jira profile'


if ([string]::IsNullOrWhitespace($Uri)) {
    throw "Missing parameter value for 'Jira.Transition.Url'"
}
if ([string]::IsNullOrWhitespace($Jql)) {
    throw "Missing parameter value for 'Jira.Transition.Query'"
}
if ([string]::IsNullOrWhitespace($Transition)) {
    throw "Missing parameter value for 'Jira.Transition.Name'"
}
if ([string]::IsNullOrWhitespace($User)) {
    throw "Missing parameter value for 'Jira.Transition.Username'"
}
if ([string]::IsNullOrWhitespace($Password)) {
    throw "Missing parameter value for 'Jira.Transition.Password'"
}

function Create-Uri {
    Param (
        $BaseUri,
        $ChildUri
    )

    if ([string]::IsNullOrWhitespace($BaseUri)) {
        throw "BaseUri is null or empty!"
    }
    if ([string]::IsNullOrWhitespace($ChildUri)) {
        throw "ChildUri is null or empty!"
    }
    $CombinedUri = "$($BaseUri.TrimEnd("/"))/$($ChildUri.TrimStart("/"))"
    return New-Object -TypeName System.Uri $CombinedUri
}

function Jira-QueryApi {
    Param (
        [Uri]$Query,
        [string]$Username,
        [string]$Password
    );

    Write-Output "Querying JIRA API $($Query.AbsoluteUri)"

    # Prepare the Basic Authorization header - PSCredential doesn't seem to work
    $base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $Username, $Password)))
    $headers = @{Authorization = ("Basic {0}" -f $base64AuthInfo) }

    # Execute the query
    Invoke-RestMethod -Uri $Query -Headers $headers
}

function Jira-ExecuteApi {
    Param (
        [Uri]$Query,
        [string]$Body,
        [string]$Username,
        [string]$Password
    );

    Write-Output "Posting JIRA API $($Query.AbsoluteUri)"

    $base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $Username, $Password)))
    $headers = @{Authorization = ("Basic {0}" -f $base64AuthInfo) }

    Invoke-RestMethod -Uri $Query -Headers $headers -UseBasicParsing -Body $Body -Method Post -ContentType "application/json"
}

function Jira-GetTransitions {
    Param (
        [Uri]$TransitionsUri,
        [string]$Username,
        [string]$Password
    );

    $transitions = Jira-QueryApi -Query $TransitionsUri -Username $Username -Password $Password
    $transitions.transitions
}

function Jira-PostTransition {
    Param (
        [Uri]$TransitionsUri,
        [string]$Username,
        [string]$Password,
        [string]$Body
    );

    Jira-ExecuteApi -Query $TransitionsUri -Body $body -Username $Username -Password $Password
}

function Jira-TransitionTicket {
    Param (
        [Uri]$IssueUri,
        [string]$Username,
        [string]$Password,
        [string]$Transition
    );

    $query = $IssueUri.AbsoluteUri + "/transitions"
    $uri = [System.Uri] $query

    $transitions = Jira-GetTransitions -TransitionsUri $uri -Username $Username -Password $Password
    $match = $transitions | Where-Object name -eq $Transition | Select-Object -First 1
    $comment = "Status automatically updated via Octopus Deploy with release {0} of {1} to {2}" -f $OctopusParameters['Octopus.Action.Package.PackageVersion'], $OctopusParameters['Octopus.Project.Name'], $OctopusParameters['Octopus.Environment.Name'] 
    
    If ($null -ne $match) {
        $transitionId = $match.id
        $body = "{ ""update"": { ""comment"": [ { ""add"" : { ""body"" : ""$comment"" } } ] }, ""transition"": { ""id"": ""$transitionId"" } }"

        Jira-PostTransition -TransitionsUri $uri -Body $body -Username $Username -Password $Password
    }
}

function Jira-TransitionTickets {
    Param (
        [string]$BaseUri,
        [string]$Username,
        [string]$Password,
        [string]$Jql,
        [string]$Transition
    );

    $childUri = ("/rest/api/2/search?jql=" + $Jql)
    $queryUri = Create-Uri -BaseUri $BaseUri -ChildUri $childUri
    
    $json = Jira-QueryApi -Query $queryUri -Username $Username -Password $Password

    If ($json.total -eq 0) {
        Write-Output "No issues were found that matched your query : $Jql"
    }
    Else {
        ForEach ($issue in $json.issues) {
            Jira-TransitionTicket -IssueUri $issue.self -Transition $Transition -Username $Username -Password $Password
        }
    }
}
Write-Output "JIRA - Create Transition"
Write-Output "  JIRA URL   : $Uri"
Write-Output "  JIRA JQL   : $Jql"
Write-Output "  Transition : $Transition"
Write-Output "  Username   : $User"
try {
    Jira-TransitionTickets -BaseUri $Uri -Jql $Jql -Transition $Transition -Username $User -Password $Password
}
catch {
    Write-Error "An error occurred while attempting to transition the JIRA issues: $($_.Exception)"
}```

Upvotes: 0

Views: 234

Answers (1)

MuhammadSannan
MuhammadSannan

Reputation: 109

This PowerShell script uses basic authentication username and password. no need to encode base 64 password.

Upvotes: 1

Related Questions