Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Le Kit de développement logiciel (SDK) OAuth2Manager dans l’application Windows permet aux applications de bureau telles que WinUI 3 d’effectuer en toute transparence l’autorisation OAuth 2.0 sur Windows. L’API OAuth2Manager ne fournit pas d’API pour les informations d’identification de mot de passe de la demande implicite et du propriétaire de la ressource en raison des problèmes de sécurité qui impliquent. Utilisez le type d’octroi de code d’autorisation avec la clé de preuve pour l’échange de code (PKCE). Pour plus d'informations, consultez le RFC PKCE.
Arrière-plan OAuth 2.0 pour les applications Windows
Windows Runtime (WinRT) WebAuthenticationBroker, principalement conçu pour les applications UWP, présente plusieurs défis lorsqu’ils sont utilisés dans les applications de bureau. Les principaux problèmes incluent la dépendance à ApplicationView, qui n’est pas compatible avec les infrastructures d’application de bureau. Par conséquent, les développeurs doivent recourir à des solutions de contournement impliquant des interfaces d’interopérabilité et du code supplémentaire pour implémenter des fonctionnalités OAuth 2.0 dans WinUI 3 et d’autres applications de bureau.
API OAuth2Manager dans le Kit de développement logiciel (SDK) d’application Windows
L’API OAuth2Manager pour le SDK d’application Windows fournit une solution simplifiée qui répond aux attentes des développeurs. Il offre des fonctionnalités OAuth 2.0 transparentes avec une parité complète des fonctionnalités sur toutes les plateformes Windows prises en charge par le Kit de développement logiciel (SDK) d’application Windows. La nouvelle API élimine le besoin de solutions de contournement fastidieuses et simplifie le processus d’incorporation de fonctionnalités OAuth 2.0 dans les applications de bureau.
OAuth2Manager est différent de WebAuthenticationBroker dans WinRT. Il suit les meilleures pratiques OAuth 2.0 plus étroitement , par exemple en utilisant le navigateur par défaut de l’utilisateur. Les meilleures pratiques pour l’API proviennent de l’IETF (Internet Engineering Task Force) OAuth 2.0 Authorization Framework RFC 6749, PKCE RFC 7636 et OAuth 2.0 for Native Apps RFC 8252.
Exemples de code OAuth 2.0
Un exemple complet d’application WinUI 3 est disponible sur GitHub. Les sections suivantes fournissent des extraits de code pour les flux OAuth 2.0 les plus courants à l’aide de l’API OAuth2Manager .
Demande de code d’autorisation
L’exemple suivant montre comment effectuer une demande de code d’autorisation à l’aide de OAuth2Manager dans le Kit de développement logiciel (SDK) d’application Windows :
// 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());
}
Code d’autorisation Exchange pour le jeton d’accès
L’exemple suivant montre comment échanger un code d’autorisation pour un jeton d’accès à l’aide de OAuth2Manager.
Pour les clients publics (comme les applications de bureau natives) qui utilisent PKCE, n’incluez pas de clé secrète client. Le vérificateur de code PKCE fournit plutôt la sécurité :
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());
}
Pour les clients confidentiels (comme les applications web ou les services) qui ont une clé secrète client, incluez le ClientAuthentication paramètre :
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
Actualiser un jeton d’accès
L’exemple suivant montre comment actualiser un jeton d’accès à l’aide de la méthode RefreshTokenAsyncd’OAuth2Manager.
Pour les clients publics qui utilisent PKCE, omettez le ClientAuthentication paramètre :
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());
}
Pour les clients confidentiels qui ont une clé secrète client, incluez le ClientAuthentication paramètre :
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
Effectuer une demande d’autorisation
Pour effectuer une demande d’autorisation à partir d’une activation de protocole, votre application doit gérer l’événement AppInstance.Activated . Cet événement est requis lorsque votre application a une logique de redirection personnalisée. Un exemple complet est disponible sur GitHub.
Utilisez le code suivant :
void App::OnActivated(const IActivatedEventArgs& args)
{
if (args.Kind() == ActivationKind::Protocol)
{
auto protocolArgs = args.as<ProtocolActivatedEventArgs>();
if (OAuth2Manager::CompleteAuthRequest(protocolArgs.Uri()))
{
TerminateCurrentProcess();
}
DisplayUnhandledMessageToUser();
}
}
Contenu connexe
Windows developer