Demander des revendications personnalisées à l’aide de MSAL pour iOS et macOS

OpenID Connect vous permet de demander éventuellement le retour de revendications individuelles à partir du point de terminaison UserInfo et/ou dans le jeton d’ID. Une demande de revendications est représentée en tant qu’objet JSON qui contient une liste de revendications demandées. Pour plus d’informations , consultez OpenID Connect Core 1.0 .

Le Microsoft Authentication Library (MSAL) pour iOS et macOS permet de demander des revendications spécifiques dans des scénarios d’acquisition de jetons interactifs et silencieux. Il le fait par le biais du claimsRequest paramètre.

Il existe plusieurs scénarios où cela est nécessaire. Par exemple:

  • Demande de revendications en dehors de l’ensemble standard de votre application.
  • Demande de combinaisons spécifiques des revendications standard qui ne peuvent pas être spécifiées à l’aide d’étendues pour votre application. Par exemple, si un jeton d’accès est rejeté en raison de revendications manquantes, l’application peut demander les revendications manquantes à l’aide de MSAL.

Note

MSAL contourne le cache des jetons d’accès chaque fois qu’une requête de revendications est spécifiée. Il est important de fournir uniquement un claimsRequest paramètre lorsque des revendications supplémentaires sont nécessaires (par opposition à toujours fournir le même claimsRequest paramètre dans chaque appel d’API MSAL).

claimsRequest peut être spécifié dans MSALSilentTokenParameters et 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 peut être construit à partir d’une représentation NSString d’une demande de revendications 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)

Elle peut également être modifiée en demandant des revendications spécifiques supplémentaires :

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 doit ensuite être défini dans les paramètres de jeton et fourni à l’une des API d’acquisition de jetons 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            ...