Microsoft Information Protection SDK: implementar un delegado de autenticación (C++)

El SDK de MIP implementa un delegado de autenticación para administrar los desafíos de autenticación y responder con un token. No implementa por sí mismo la adquisición de tokens. El proceso de adquisición de tokens es del desarrollador y se logra ampliando la mip::AuthDelegate clase, específicamente la AcquireOAuth2Token función miembro.

Building AuthDelegateImpl

Para extender la clase mip::AuthDelegate base, creamos una nueva clase denominada sample::auth::AuthDelegateImpl . Esta clase implementa la funcionalidad y configura el constructor para AcquireOAuth2Token que tome nuestros parámetros de autenticación.

auth_delegate_impl.h

En este ejemplo, el constructor predeterminado solo acepta el nombre de usuario, la contraseña y el id. de aplicación de la aplicación. Estos se almacenarán en las variables mUserName privadas mPassword , y mClientId .

Es importante tener en cuenta que no es necesario implementar información como el proveedor de identidades o el URI de recursos, al menos no en el AuthDelegateImpl constructor. Esa información se pasa como parte AcquireOAuth2Token del OAuth2Challenge objeto. En su lugar, pasaremos esos detalles a la AcquireToken llamada AcquireOAuth2Token en .

//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 es donde se realizará la llamada al proveedor de OAuth2. En el ejemplo, a continuación hay dos llamadas a AcquireToken() . En la práctica, solo se realizaría una llamada. Estas implementaciones se tratarán en las secciones que se proporcionan en Pasos siguientes

//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;
    }
}
}

Pasos siguientes

Para completar la implementación de autenticación, es necesario crear el código detrás de la AcquireToken() función. En los ejemplos siguientes se debata unas cuantas formas de adquirir el token.