2017-12-10 2 views
0

Ich versuche, ein Webhook-Abonnement zu registrieren, um meine Anwendung zu benachrichtigen, wenn ein Arbeitselement bearbeitet wird. Ich dachte, ich würde mit einem workitem.created Webhook beginnen. Allerdings - ich bekomme die gleiche Fehlerreaktion, egal welches Abonnement ich versuche zu registrieren, einschließlich des Beispiels aus der Dokumentation. Hier ist mein Beispiel:Ich kann über die REST-API kein VSTS-Webhook-Abonnement erstellen

POST:

https://{my-app}.visualstudio.com/DefaultCollection/_apis/hooks/subscriptions/?api-version=1.0 

Headers:

Authorization:Bearer my-auth-token 
Content-Type: application/json 

Körper:

{ 
    "publisherId": "tfs", 
    "eventType": "build.complete", 
    "resourceVersion": "1.0-preview.1", 
    "consumerId": "webHooks", 
    "consumerActionId": "httpRequest", 
    "publisherInputs": { 
    "buildStatus": "Failed", 
    "definitionName": "MyWebSite CI", 
    "projectId": "my-project-id" 
    }, 
    "consumerInputs": { 
    "url": "https://requestb.in/14xw4741" 
    } 
} 

Die Fehlerreaktion erhalte ich:

{ 
    "$id": "1", 
    "innerException": null, 
    "message": "TF400898: An Internal Error Occurred. Activity Id: ecb81b36-4a77-4ae8-9d13-1a5dbb473c8a.", 
    "typeName": "System.Exception, mscorlib", 
    "typeKey": "Exception", 
    "errorCode": 0, 
    "eventId": 0 
} 

Ich habe versucht, mehr API-Versionen:

api-version=4.1-preview 
api-version=1.0 
api-version=2.0 
api-version=3.0 

ich auch mehr resourceVersion s versucht.

Ich habe folgenden Auth-Token -umfang: vso.dashboards, vso.identity, vso.notification_manage, vso.work_full, vso.workitemsearch

Antwort

0

Dies ist ein Problem mit Bearer Token das REST-API und ein Feedback bereits zum VSTS Team vorgelegt: Create webhook with workitem.created EventType and OAuth token fail

Als Workaround können Sie die grundlegende Autorisierung verwenden: Sie können stattdessen ein persönliches Zugriffstoken oder ein alternatives Konto verwenden. Ich testete mit unten PS Probe und das hat für mich funktioniert.

z:

Param(
    [string]$vsoAccount = "YouVsoAccount", 
    [string]$keepForever = "true", 
    [string]$user = "xxxx", 
    [string]$token = "qwdiqwaey4aosdgbyqhrdpnvwitguqe2kqllcoc46vvvrxxxkiruq" 
) 

# Base64-encodes the Personal Access Token (PAT) appropriately 
$base64AuthInfo = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(("{0}:{1}" -f $user,$token))) 


function CreateJsonBody 
{ 

    $value = @" 

{"consumerActionId":"httpRequest","consumerId":"webHooks","consumerInputs":{"url":"http://xxxx"},"eventType":"workitem.updated","publisherId":"tfs","publisherInputs":{"areaPath":"\\TFVC\\","workItemType":"","changedFields":"","projectId":"0142146b-3ee9-495f-8ef0-e8fe223d6571"},"resourceVersion":"1.0","scope":1} 

"@ 

return $value 
} 

$json = CreateJsonBody 

$uri = "https://$($vsoAccount).visualstudio.com/DefaultCollection/_apis/hooks/subscriptions?api-version=1.0" 
$result = Invoke-RestMethod -Uri $uri -Method Post -Body $json -ContentType "application/json" -Headers @{Authorization=("Basic {0}" -f $base64AuthInfo)} 

Write-Host $ base64AuthInfo

ähnlicher Faden für Ihre Referenz: Creating VSTS ServiceHooks (WebHooks) via Rest Api for work item created event fails. Please give a solution


UPDATE:

Authorization: Basic base-64-token-here Werke auf meinem s ide. Bitte stellen Sie sicher, dass Sie die richtige Base64-encodes dort haben.

Eigentlich müssen Sie nur die PAT als das Passwort unter Authorization Registerkarte in Postman einfügen, es wird automatisch das Token in Postman.

Eine andere Möglichkeit ist die Codierung der PAT in anderen Tools (z. B. können Sie die $base64AuthInfo von oben PS-Beispiel ausgeben), kopieren Sie dann und fügen Sie die base-64-token in der Kopfzeile. Beides funktioniert für mich.

Ausgang für das $ base64AuthInfo: Write-Host $base64AuthInfo

enter image description here

+0

Beifall für die Antwort ... bekomme ich nur ein Zeichen in Seite zurück ... nur um zu bestätigen, ich bin kodiert meine oAuth Zugriffstoken (PAT) auf eine Base64-Zeichenfolge und Hinzufügen der Kopfzeile: 'Autorisierung: Basic Base-64-Token-here' Können wir versuchen, den Code sprachunabhängig zu halten? Ich benutze C# nicht - also lass uns einfach in Bezug auf REST-APIs sprechen :) Volle Antwort hier: [https://developercommunity.visualstudio.com/content/problem/149872/create-webhook-with-workitemcreated-eventtype -und.html] (https://developercommunity.visualstudio.com/content/problem/149872/create-webhook-with-workitemcreated-eventtype-and.html) – jpsear

+0

@jpsear 'Autorisierung: Basic base-64-token-here 'arbeitet auf meiner Seite. Bitte stellen Sie sicher, dass Sie dort die richtigen Base64-Kodierungen haben. Eigentlich müssen Sie nur die PAT als Passwort unter dem Tab "Authorization" in Postman einfügen, es wird das Token automatisch in Postman codieren. Eine andere Möglichkeit besteht darin, das Token in anderen Tools zu codieren (z. B. können Sie das '$ base64AuthInfo' aus dem PS-Beispiel ausgeben), dann kopieren und fügen Sie das' base-64-token' in den Header ein. Beides funktioniert für mich. Details finden Sie in der entsprechenden Antwort. –

+0

Okay - ich denke ich folge dir jetzt, der PAT ist eigentlich anders als ein JWT. Ich habe meinen Base64-codierten JWT als Basic-Authentifizierungs-Token eingefügt. Ich habe es geschafft, es mit einer PAT zu erstellen, die von dem Konto des Benutzers generiert wird. Allerdings - das ist überhaupt nicht ideal. Kann ich zumindest eine PAT programmatisch erzeugen? Ich möchte nicht, dass der Benutzer Token usw. verwalten muss ... – jpsear