Delen via


Azure DevOps OAuth 2.0 gebruiken om een web-app te maken

Azure DevOps Services

Belangrijk

Deze informatie is alleen bedoeld voor bestaande Azure DevOps OAuth-apps. Nieuwe app-ontwikkelaars moeten Microsoft Entra ID OAuth gebruiken om te integreren met Azure DevOps.

Azure DevOps is een id-provider voor OAuth 2.0-apps. Met onze implementatie van OAuth 2.0 kunnen ontwikkelaars hun app autoriseren voor gebruikers en toegangstokens krijgen voor Azure DevOps-resources.

Aan de slag met Azure DevOps OAuth

1. Uw app registreren

  1. Ga naar https://app.vsaex.visualstudio.com/app/register uw app registreren.

  2. Selecteer de bereiken die uw toepassing nodig heeft en gebruik vervolgens dezelfde bereiken wanneer u uw app autoriseert. Als u uw app hebt geregistreerd met behulp van de preview-API's, registreert u zich opnieuw omdat de bereiken die u hebt gebruikt, nu worden afgeschaft.

  3. Selecteer Toepassing maken.

    De pagina met toepassingsinstellingen wordt weergegeven.

    Screenshot showing Applications settings for your app.

    • Wanneer Azure DevOps Services de autorisatiegoedkeuringspagina voor uw gebruiker presenteert, wordt uw bedrijfsnaam, app-naam en beschrijvingen gebruikt. Ook worden de URL's gebruikt voor uw bedrijfswebsite, app-website en servicevoorwaarden en privacyverklaringen.

      Screenshot showing Visual Studio Codespaces authorization page with your company and app information.

    • Wanneer Azure DevOps Services vraagt om de autorisatie van een gebruiker en de gebruiker deze verleent, wordt de browser van de gebruiker omgeleid naar de callback-URL voor autorisatie met de autorisatiecode. De callback-URL moet een beveiligde verbinding (https) zijn om de code terug te zetten naar de app en exact overeen te komen met de URL die in uw app is geregistreerd. Als dit niet het probleem is, wordt er een 400-foutpagina weergegeven in plaats van een pagina waarin de gebruiker wordt gevraagd om toestemming te verlenen aan uw app.

  4. Roep de autorisatie-URL aan en geef uw app-id en geautoriseerde bereiken door wanneer u een gebruiker uw app toestemming wilt geven voor toegang tot hun organisatie. Roep de URL van het toegangstoken aan wanneer u een toegangstoken wilt ophalen om een Azure DevOps Services REST API aan te roepen.

De instellingen voor elke app die u registreert, zijn beschikbaar via uw profiel https://app.vssps.visualstudio.com/profile/view.

2. Uw app autoriseren

  1. Als uw gebruiker uw app niet heeft geautoriseerd voor toegang tot hun organisatie, roept u de autorisatie-URL aan. U wordt terug met een autorisatiecode aanroepen als de gebruiker de autorisatie goedkeurt.
https://app.vssps.visualstudio.com/oauth2/authorize
        ?client_id={app ID}
        &response_type={Assertion}
        &state={state}
        &scope={scope}
        &redirect_uri={callback URL}
Parameter Type Opmerkingen
client_id GUID De id die is toegewezen aan uw app toen deze is geregistreerd.
response_type tekenreeks Assertion
staat tekenreeks Kan elke waarde zijn. Doorgaans een gegenereerde tekenreekswaarde die de callback correleert met de bijbehorende autorisatieaanvraag.
bereik tekenreeks Bereiken die zijn geregistreerd bij de app. Afstand gescheiden. Bekijk beschikbare bereiken.
redirect_uri URL Callback-URL voor uw app. Moet exact overeenkomen met de URL die is geregistreerd bij de app.
  1. Voeg een koppeling of knop toe aan uw site waarmee de gebruiker naar het autorisatie-eindpunt van Azure DevOps Services wordt gebracht:
https://app.vssps.visualstudio.com/oauth2/authorize
        ?client_id=88e2dd5f-4e34-45c6-a75d-524eb2a0399e
        &response_type=Assertion
        &state=User1
        &scope=vso.work%20vso.code_write
        &redirect_uri=https://fabrikam.azurewebsites.net/myapp/oauth-callback

Azure DevOps Services vraagt de gebruiker om uw app te autoriseren.

Ervan uitgaande dat de gebruiker akkoord gaat, leidt Azure DevOps Services de browser van de gebruiker om naar uw callback-URL, inclusief een kortdurende autorisatiecode en de statuswaarde die is opgegeven in de autorisatie-URL:

https://fabrikam.azurewebsites.net/myapp/oauth-callback
        ?code={authorization code}
        &state=User1

3. Een toegangs- en vernieuwingstoken voor de gebruiker ophalen

Gebruik de autorisatiecode om een toegangstoken (en vernieuwingstoken) aan te vragen voor de gebruiker. Uw service moet een HTTP-aanvraag voor de service naar Azure DevOps Services indienen.

URL : app autoriseren

POST https://app.vssps.visualstudio.com/oauth2/token

HTTP-aanvraagheaders - app autoriseren

Koptekst Weergegeven als
Inhoudstype application/x-www-form-urlencoded
Content-Type: application/x-www-form-urlencoded

Hoofdtekst van HTTP-aanvraag - app autoriseren

client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer&client_assertion={0}&grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&assertion={1}&redirect_uri={2}

Vervang de tijdelijke aanduidingen in de vorige voorbeeldaanvraagtekst:

  • {0}: door URL gecodeerd clientgeheim dat is verkregen toen de app werd geregistreerd
  • {1}: MET URL gecodeerde 'code' die via de code queryparameter is opgegeven voor uw callback-URL
  • {2}: callback-URL geregistreerd bij de app

C#-voorbeeld om de aanvraagbody te vormen - app autoriseren

public string GenerateRequestPostData(string appSecret, string authCode, string callbackUrl)
{
   return String.Format("client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer&client_assertion={0}&grant_type=urn:ietf:params:oauth:grant-type:jwt-bearer&assertion={1}&redirect_uri={2}",
               HttpUtility.UrlEncode(appSecret),
               HttpUtility.UrlEncode(authCode),
               callbackUrl
        );
}

Antwoord - app autoriseren

{
    "access_token": { access token for the user },
    "token_type": { type of token },
    "expires_in": { time in seconds that the token remains valid },
    "refresh_token": { refresh token to use to acquire a new access token }
}

Belangrijk

De refresh_token veilig behouden, zodat uw app de gebruiker niet opnieuw hoeft te vragen om toestemming te geven. Toegangstokens verlopen snel en mogen niet worden behouden.

4. Het toegangstoken gebruiken

Als u een toegangstoken wilt gebruiken, neemt u dit op als bearer-token in de autorisatie-header van uw HTTP-aanvraag:

Authorization: Bearer {access_token}

Bijvoorbeeld de HTTP-aanvraag voor het ophalen van recente builds voor een project:

GET https://dev.azure.com/myaccount/myproject/_apis/build-release/builds?api-version=3.0
Authorization: Bearer {access_token}

5. Een verlopen toegangstoken vernieuwen

Als het toegangstoken van een gebruiker verloopt, kunt u het vernieuwingstoken gebruiken dat ze in de autorisatiestroom hebben verkregen om een nieuw toegangstoken op te halen. Het is vergelijkbaar met het oorspronkelijke proces voor het uitwisselen van de autorisatiecode voor een toegangs- en vernieuwingstoken.

URL : token vernieuwen

POST https://app.vssps.visualstudio.com/oauth2/token

HTTP-aanvraagheaders - token vernieuwen

Koptekst Weergegeven als
Inhoudstype application/x-www-form-urlencoded
Content-Length Berekende tekenreekslengte van de aanvraagbody (zie het volgende voorbeeld)
Content-Type: application/x-www-form-urlencoded
Content-Length: 1654

Hoofdtekst van HTTP-aanvraag - token vernieuwen

client_assertion_type=urn:ietf:params:oauth:client-assertion-type:jwt-bearer&client_assertion={0}&grant_type=refresh_token&assertion={1}&redirect_uri={2}

Vervang de tijdelijke aanduidingen in de vorige voorbeeldaanvraagtekst:

  • {0}: door URL gecodeerd clientgeheim dat is verkregen toen de app werd geregistreerd
  • {1}: met URL gecodeerd vernieuwingstoken voor de gebruiker
  • {2}: callback-URL geregistreerd bij de app

Antwoord - token vernieuwen

{
    "access_token": { access token for this user },
    "token_type": { type of token },
    "expires_in": { time in seconds that the token remains valid },
    "refresh_token": { new refresh token to use when the token has timed out }
}

Belangrijk

Er wordt een nieuw vernieuwingstoken uitgegeven voor de gebruiker. Behoud dit nieuwe token en gebruik het de volgende keer dat u een nieuw toegangstoken voor de gebruiker moet verkrijgen.

Voorbeelden

U vindt een C#-voorbeeld waarmee OAuth wordt geïmplementeerd om AZURE DevOps Services REST API's aan te roepen in ons C# OAuth GitHub-voorbeeld.

Clientgeheim opnieuw genereren

Om de 5 jaar verloopt uw toepassingsgeheim. U verwacht dat u uw app-geheim opnieuw genereert, zodat u nog steeds toegangstokens en vernieuwingstokens kunt maken en gebruiken. Hiervoor klikt u op de knop Geheim opnieuw genereren. Er wordt een dialoogvenster weergegeven om te bevestigen dat u deze actie wilt voltooien.

Screenshot confirming secret regeneration.

Wanneer u bevestigt dat u opnieuw wilt genereren, werkt het vorige app-geheim niet meer en werken alle eerdere tokens die met dit geheim zijn gebruikt, ook niet meer. Zorg ervoor dat deze clientgeheimrotatie goed wordt getimed om downtime van klanten tot een minimum te beperken.

Veelgestelde vragen (FAQ's)

V: Kan ik OAuth gebruiken met mijn mobiele telefoon-app?

A: Nee. Azure DevOps Services ondersteunt alleen de webserverstroom, dus er is geen manier om OAuth te implementeren, omdat u het app-geheim niet veilig kunt opslaan.

V: Welke fouten of speciale voorwaarden moet ik afhandelen in mijn code?

A: Zorg ervoor dat u de volgende voorwaarden afhandelt:

  • Als uw gebruiker de toegang tot uw app weigert, wordt er geen autorisatiecode geretourneerd. Gebruik de autorisatiecode niet zonder te controleren op weigering.
  • Als uw gebruiker de autorisatie van uw app intrekt, is het toegangstoken niet meer geldig. Wanneer uw app het token gebruikt om toegang te krijgen tot gegevens, wordt er een 401-fout geretourneerd. Autorisatie opnieuw aanvragen.

V: Ik wil lokaal fouten opsporen in mijn web-app. Kan ik localhost gebruiken voor de callback-URL wanneer ik mijn app registreer?

A: Ja. Azure DevOps Services staat nu localhost toe in uw callback-URL. Zorg ervoor dat u https://localhost als het begin van uw callback-URL gebruikt wanneer u uw app registreert.

V: Ik krijg een HTTP 400-fout wanneer ik probeer een toegangstoken op te halen. Wat kan er mis zijn?

A: Controleer of u het inhoudstype instelt op application/x-www-form-urlencoded in de aanvraagheader.

V: Ik krijg een HTTP 401-fout wanneer ik een op OAuth gebaseerd toegangstoken gebruik, maar een PAT met hetzelfde bereik werkt prima. Waarom?

A: Controleer of de toegang van toepassingen van derden via OAuth niet is uitgeschakeld door de beheerder van uw organisatie op https://dev.azure.com/{your-org-name}/_settings/organizationPolicy. In dit scenario werkt de stroom om een app te autoriseren en een toegangstoken te genereren, maar alle REST API's retourneren alleen een fout, zoals TF400813: The user "<GUID>" is not authorized to access this resource.

V: Kan ik OAuth gebruiken met de SOAP-eindpunten en REST API's?

A: Nee. OAuth wordt momenteel alleen ondersteund in de REST API's.

V: Hoe kan ik details van bijlagen voor mijn werkitem ophalen met behulp van Azure DevOps REST API's?

A: Haal eerst de details van het werkitem op met Werkitems - REST API voor werkitems ophalen:

GET https://dev.azure.com/{organization}/{project}/_apis/wit/workitems/{id}

Als u de details van de bijlagen wilt ophalen, moet u de volgende parameter toevoegen aan de URL:

$expand=all

Met de resultaten krijgt u de relatie-eigenschap. Daar vindt u de URL van de bijlagen en binnen de URL kunt u de id vinden. Voorbeeld:

$url = https://dev.azure.com/{organization}/{project}/_apis/wit/workitems/434?$expand=all&api-version=5.0

$workItem = Invoke-RestMethod -Uri $url -Method Get -ContentType application/json

$split = ($workitem.relations.url).Split('/')

$attachmentId = $split[$split.count - 1]

# Result: 1244nhsfs-ff3f-25gg-j64t-fahs23vfs