Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Met de OAuth2Manager in Windows App SDK kunnen bureaubladtoepassingen zoals WinUI 3 naadloos OAuth 2.0-autorisatie uitvoeren op Windows. De OAuth2Manager-API biedt geen API's voor de impliciete aanvraag- en wachtwoordreferentie van de resource-eigenaar vanwege de beveiligingsproblemen. Gebruik het type autorisatiecodetoestemming met Proof Key for Code Exchange (PKCE). Zie de PKCE RFC voor meer informatie.
Opmerking
OAuth2Manager is ontworpen voor algemene OAuth 2.0-stromen met elke id-provider (GitHub, Google, aangepast, enzovoort) en gebruikt altijd de systeembrowser voor de autorisatiestap. Als u zich specifiek wilt aanmelden met Microsoft-accounts of Microsoft Entra ID (werk-/school)-accounts met silent SSO, met behulp van het account dat al is aangemeld bij Windows, zonder browserprompt: gebruik in plaats daarvan MSAL.NET met de WAM-broker (Web Account Manager. Web Account Manager biedt ook Windows Hello integratie en ondersteuning voor voorwaardelijke toegang die OAuth2Manager niet doet.
OAuth2Manager-API in Windows App SDK
De API OAuth2Manager voor Windows App SDK biedt een gestroomlijnde oplossing die voldoet aan de verwachtingen van ontwikkelaars. Het biedt naadloze OAuth 2.0-mogelijkheden met volledige functiepariteit voor alle Windows platforms die worden ondersteund door Windows App SDK. De nieuwe API elimineert de noodzaak van omslachtige tijdelijke oplossingen en vereenvoudigt het proces van het integreren van OAuth 2.0-functionaliteit in desktop-apps.
De OAuth2Manager verschilt van de WebAuthenticationBroker in WinRT. Het volgt aanbevolen procedures voor OAuth 2.0, bijvoorbeeld door de standaardbrowser van de gebruiker te gebruiken. De aanbevolen procedures voor de API zijn afkomstig van de IETF (Internet Engineering Task Force) OAuth 2.0 Authorization Framework RFC 6749, PKCE RFC 7636 en OAuth 2.0 for Native Apps RFC 8252.
Voorbeelden van OAuth 2.0-code
Er is een volledige WinUI-voorbeeld-app beschikbaar op GitHub. De volgende secties bevatten codefragmenten voor de meest voorkomende OAuth 2.0-stromen met behulp van de OAuth2Manager-API.
Aanvraag voor autorisatiecode
In het volgende voorbeeld ziet u hoe u een autorisatiecodeaanvraag uitvoert met behulp van de OAuth2Manager in Windows App SDK:
// Get the WindowId for the application window
Microsoft::UI::WindowId parentWindowId = this->AppWindow().Id();
AuthRequestParams authRequestParams = AuthRequestParams::CreateForAuthorizationCodeRequest(L"my_client_id",
Uri(L"my-app:/oauth-callback/"));
authRequestParams.Scope(L"user:email user:birthday");
AuthRequestResult authRequestResult = co_await OAuth2Manager::RequestAuthWithParamsAsync(parentWindowId,
Uri(L"https://my.server.com/oauth/authorize"), authRequestParams);
if (AuthResponse authResponse = authRequestResult.Response())
{
//To obtain the authorization code
//authResponse.Code();
//To obtain the access token
DoTokenExchange(authResponse);
}
else
{
AuthFailure authFailure = authRequestResult.Failure();
NotifyFailure(authFailure.Error(), authFailure.ErrorDescription());
}
Exchange autorisatiecode voor toegangstoken
In het volgende voorbeeld ziet u hoe u een autorisatiecode kunt inwisselen voor een access token met behulp van de OAuth2Manager.
Neem geen clientgeheim op voor openbare clients (zoals systeemeigen bureaublad-apps) die GEBRUIKMAKEN van PKCE. De PKCE-codeverificator biedt in plaats daarvan de beveiliging:
AuthResponse authResponse = authRequestResult.Response();
TokenRequestParams tokenRequestParams = TokenRequestParams::CreateForAuthorizationCodeRequest(authResponse);
// For public clients using PKCE, do not include ClientAuthentication
TokenRequestResult tokenRequestResult = co_await OAuth2Manager::RequestTokenAsync(
Uri(L"https://my.server.com/oauth/token"), tokenRequestParams);
if (TokenResponse tokenResponse = tokenRequestResult.Response())
{
String accessToken = tokenResponse.AccessToken();
String tokenType = tokenResponse.TokenType();
// RefreshToken string null/empty when not present
if (String refreshToken = tokenResponse.RefreshToken(); !refreshToken.empty())
{
// ExpiresIn is zero when not present
DateTime expires = winrt::clock::now();
if (String expiresIn = tokenResponse.ExpiresIn(); std::stoi(expiresIn) != 0)
{
expires += std::chrono::seconds(static_cast<int64_t>(std::stoi(expiresIn)));
}
else
{
// Assume a duration of one hour
expires += std::chrono::hours(1);
}
//Schedule a refresh of the access token
myAppState.ScheduleRefreshAt(expires, refreshToken);
}
// Use the access token for resources
DoRequestWithToken(accessToken, tokenType);
}
else
{
TokenFailure tokenFailure = tokenRequestResult.Failure();
NotifyFailure(tokenFailure.Error(), tokenFailure.ErrorDescription());
}
Voor confidentiƫle clients (zoals web apps of services) met een clientgeheim, neemt u de parameter ClientAuthentication op:
AuthResponse authResponse = authRequestResult.Response();
TokenRequestParams tokenRequestParams = TokenRequestParams::CreateForAuthorizationCodeRequest(authResponse);
ClientAuthentication clientAuth = ClientAuthentication::CreateForBasicAuthorization(L"my_client_id",
L"my_client_secret");
TokenRequestResult tokenRequestResult = co_await OAuth2Manager::RequestTokenAsync(
Uri(L"https://my.server.com/oauth/token"), tokenRequestParams, clientAuth);
// Handle the response as shown in the previous example
Een access-token vernieuwen
In het volgende voorbeeld ziet u hoe u een access token vernieuwt met behulp van de methode OAuth2ManagerRefreshTokenAsync.
Laat de parameter weg voor ClientAuthentication die GEBRUIKMAKEN van PKCE:
TokenRequestParams tokenRequestParams = TokenRequestParams::CreateForRefreshToken(refreshToken);
// For public clients using PKCE, do not include ClientAuthentication
TokenRequestResult tokenRequestResult = co_await OAuth2Manager::RequestTokenAsync(
Uri(L"https://my.server.com/oauth/token"), tokenRequestParams);
if (TokenResponse tokenResponse = tokenRequestResult.Response())
{
UpdateToken(tokenResponse.AccessToken(), tokenResponse.TokenType(), tokenResponse.ExpiresIn());
//Store new refresh token if present
if (String refreshToken = tokenResponse.RefreshToken(); !refreshToken.empty())
{
// ExpiresIn is zero when not present
DateTime expires = winrt::clock::now();
if (String expiresInStr = tokenResponse.ExpiresIn(); !expiresInStr.empty())
{
int expiresIn = std::stoi(expiresInStr);
if (expiresIn != 0)
{
expires += std::chrono::seconds(static_cast<int64_t>(expiresIn));
}
}
else
{
// Assume a duration of one hour
expires += std::chrono::hours(1);
}
//Schedule a refresh of the access token
myAppState.ScheduleRefreshAt(expires, refreshToken);
}
}
else
{
TokenFailure tokenFailure = tokenRequestResult.Failure();
NotifyFailure(tokenFailure.Error(), tokenFailure.ErrorDescription());
}
Neem de parameter op voor ClientAuthentication die een clientgeheim hebben:
TokenRequestParams tokenRequestParams = TokenRequestParams::CreateForRefreshToken(refreshToken);
ClientAuthentication clientAuth = ClientAuthentication::CreateForBasicAuthorization(L"my_client_id",
L"my_client_secret");
TokenRequestResult tokenRequestResult = co_await OAuth2Manager::RequestTokenAsync(
Uri(L"https://my.server.com/oauth/token"), tokenRequestParams, clientAuth);
// Handle the response as shown in the previous example
Een autorisatieaanvraag voltooien
Als u een autorisatieaanvraag van een protocolactivering wilt voltooien, moet uw app de gebeurtenis AppInstance.Activated afhandelen. Deze gebeurtenis is vereist wanneer uw app aangepaste omleidingslogica heeft. Een volledig voorbeeld is beschikbaar op GitHub.
Gebruik de volgende code:
void App::OnActivated(const IActivatedEventArgs& args)
{
if (args.Kind() == ActivationKind::Protocol)
{
auto protocolArgs = args.as<ProtocolActivatedEventArgs>();
if (OAuth2Manager::CompleteAuthRequest(protocolArgs.Uri()))
{
TerminateCurrentProcess();
}
DisplayUnhandledMessageToUser();
}
}
Verwante inhoud
Windows developer