Kit de développement logiciel (SDK) Microsoft Information Protection - Implémentation d’un délégué d’authentification (C++)

Le SDK MIP implémente un délégué d’authentification pour gérer les défis d’authentification et répondre avec un jeton. Elle n’implémente pas elle-même l’acquisition de jetons. Le processus d’acquisition de jetons relève du développeur et s’effectue en étendant la classe mip::AuthDelegate, en particulier la méthode membre AcquireOAuth2Token.

Création d’AuthDelegateImpl

Pour étendre la classe mip::AuthDelegatede base, nous créons une classe appelée sample::auth::AuthDelegateImpl. Cette classe implémente les AcquireOAuth2Token fonctionnalités et configure le constructeur pour prendre en compte nos paramètres d’authentification.

auth_delegate_impl.h

Pour cet exemple, le constructeur par défaut accepte uniquement le nom d’utilisateur, le mot de passe et l’ID d’application de l’application. Celles-ci seront stockées dans les variables mUserNameprivées , mPasswordet mClientId.

Il est important de noter que les informations telles que le fournisseur d’identité ou l’URI de ressource ne sont pas nécessaires pour implémenter, au moins pas dans le AuthDelegateImpl constructeur. Ces informations sont transmises dans l’objet AcquireOAuth2Token sous le cadre de OAuth2Challenge. Au lieu de cela, nous transmettrons ces détails à l’appel AcquireToken dans AcquireOAuth2Token.

//auth_delegate_impl.h
#include <string.h>
#include "mip/common_types.h"

namespace sample {
namespace auth {
class AuthDelegateImpl final : public mip::AuthDelegate { //extend mip::AuthDelegate base class
public:
  AuthDelegateImpl() = delete;

//constructor accepts username, password, and mip::ApplicationInfo.
  AuthDelegateImpl::AuthDelegateImpl(
    const mip::ApplicationInfo& applicationInfo,
    std::string& username,
    const std::string& password)
    : mApplicationInfo(applicationInfo),
      mUserName(username),
      mPassword(password) {
  }

  bool AcquireOAuth2Token(const mip::Identity& identity, const OAuth2Challenge& challenge, OAuth2Token& token) override;

  private:
    std::string mUserName;
    std::string mPassword;
    std::string mClientId;
    mip::ApplicationInfo mApplicationInfo;
};
}
}

auth_delegate_impl.cpp

AcquireOAuth2Token est l’endroit où l’appel au fournisseur OAuth2 sera effectué. Dans l'exemple ci-dessous, il y a deux appels à AcquireToken(). En pratique, un seul appel serait effectué. Ces implémentations seront abordées dans les sections fournies dans les étapes suivantes

//auth_delegate_impl.cpp
#include "auth_delegate_impl.h"
#include <stdexcept>
#include "auth.h" //contains the auth class used later for token acquisition

using std::runtime_error;
using std::string;

namespace sample {
namespace auth {

AuthDelegateImpl::AuthDelegateImpl(
    const string& userName,
    const string& password,
    const string& clientId)
    : mApplicationInfo(applicationInfo),
    mUserName(userName),
    mPassword(password) {
}

//Here we could simply add our token acquisition code to AcquireOAuth2Token
//Instead, that code is implemented in auth.h/cpp to demonstrate calling an external library
bool AuthDelegateImpl::AcquireOAuth2Token(
    const mip::Identity& /*identity*/, //This won't be used
    const OAuth2Challenge& challenge,
    const OAuth2Token& token) {

      //sample::auth::AcquireToken is the code where the token acquisition routine is implemented.
      //AcquireToken() returns a string that contains the OAuth2 token.

      //Simple example for getting hard coded token. Comment out if not used.
      string accessToken = sample::auth::AcquireToken();

      //Practical example for calling external OAuth2 library with provided authentication details.
      string accessToken = sample::auth::AcquireToken(mUserName, mPassword, mApplicationInfo.applicationId, challenge.GetAuthority(), challenge.GetResource());

      //set the passed in OAuth2Token value to the access token acquired by our provider
      token.SetAccessToken(accessToken);
      return true;
    }
}
}

Prochaines étapes

Pour terminer l’implémentation de l’authentification, il est nécessaire de générer le code derrière la AcquireToken() fonction. Les exemples ci-dessous décrivent quelques façons d’acquérir le jeton.