solicitar notificaciones personalizadas mediante MSAL para iOS y macOS

OpenID Connect le permite solicitar opcionalmente la devolución de notificaciones individuales desde el punto de conexión UserInfo o en el token de identificación. Una solicitud de notificaciones se representa como un objeto JSON que contiene una lista de notificaciones solicitadas. Consulte OpenID Connect Core 1.0 para obtener más información.

La biblioteca de autenticación de Microsoft (MSAL) para iOS y macOS permite solicitar claims específicos tanto en escenarios interactivos como silenciosos de adquisición de tokens. Lo hace a través del claimsRequest parámetro .

Hay varios escenarios en los que es necesario. Por ejemplo:

  • Solicitud de notificaciones fuera del conjunto estándar de la aplicación.
  • Solicitud de combinaciones específicas de las notificaciones estándar que no se pueden especificar mediante ámbitos para la aplicación. Por ejemplo, si se rechaza un token de acceso debido a notificaciones que faltan, la aplicación puede solicitar las notificaciones que faltan mediante MSAL.

Note

MSAL omite la caché del token de acceso cada vez que se especifica una solicitud de notificaciones. Es importante proporcionar el parámetro claimsRequest solo cuando se necesiten claims adicionales (en lugar de proporcionar siempre el mismo parámetro claimsRequest en cada llamada a la API de MSAL).

claimsRequest se puede especificar en MSALSilentTokenParameters y MSALInteractiveTokenParameters:

/*!
 MSALTokenParameters is the base abstract class for all types of token parameters (silent and interactive).
 */
@interface MSALTokenParameters : NSObject

/*!
 The claims parameter that needs to be sent to authorization or token endpoint.
 If claims parameter is passed in silent flow, access token will be skipped and refresh token will be tried.
 */
@property (nonatomic, nullable) MSALClaimsRequest *claimsRequest;

@end

MSALClaimsRequest se puede construir a partir de una representación NSString de una solicitud de reclamaciones JSON.

Objective-C:

NSError *claimsError = nil;
MSALClaimsRequest *request = [[MSALClaimsRequest alloc] initWithJsonString:@"{\"id_token\":{\"auth_time\":{\"essential\":true},\"acr\":{\"values\":[\"urn:mace:incommon:iap:silver\"]}}}" error:&claimsError];

Swift:

var requestError: NSError? = nil
let request = MSALClaimsRequest(jsonString: "{\"id_token\":{\"auth_time\":{\"essential\":true},\"acr\":{\"values\":[\"urn:mace:incommon:iap:silver\"]}}}",
                                        error: &requestError)

También se puede modificar mediante la solicitud de reclamaciones específicas adicionales:

Objective-C:

MSALIndividualClaimRequest *individualClaimRequest = [[MSALIndividualClaimRequest alloc] initWithName:@"custom_claim"];
individualClaimRequest.additionalInfo = [MSALIndividualClaimRequestAdditionalInfo new];
individualClaimRequest.additionalInfo.essential = @1;
individualClaimRequest.additionalInfo.value = @"myvalue";
[request requestClaim:individualClaimRequest forTarget:MSALClaimsRequestTargetIdToken error:&claimsError];

Swift:

let individualClaimRequest = MSALIndividualClaimRequest(name: "custom-claim")
let additionalInfo = MSALIndividualClaimRequestAdditionalInfo()
additionalInfo.essential = 1
additionalInfo.value = "myvalue"
individualClaimRequest.additionalInfo = additionalInfo
do {
  try request.requestClaim(individualClaimRequest, for: .idToken)
} catch let error as NSError {
  // handle error here  
}
        

MSALClaimsRequest Después, debe establecerse en los parámetros del token y proporcionarse a una de las API de adquisiciones de tokens de MSAL:

Objective-C:

MSALPublicClientApplication *application = ...;
MSALWebviewParameters *webParameters = ...;

MSALInteractiveTokenParameters *parameters = [[MSALInteractiveTokenParameters alloc] initWithScopes:@[@"user.read"]
                                                                                  webviewParameters:webParameters];
parameters.claimsRequest = request;
    
[application acquireTokenWithParameters:parameters completionBlock:completionBlock];

Swift:

let application: MSALPublicClientApplication!
let webParameters: MSALWebviewParameters!
        
let parameters = MSALInteractiveTokenParameters(scopes: ["user.read"], webviewParameters: webParameters)
parameters.claimsRequest = request
        
application.acquireToken(with: parameters) { (result: MSALResult?, error: Error?) in            ...