Solicite reivindicações personalizadas usando MSAL para iOS e macOS

O OpenID Connect permite-lhe solicitar opcionalmente a devolução de reclamações individuais ao UserInfo Endpoint e/ou no ID Token. Um pedido de reclamações é representado como um objeto JSON que contém uma lista de reclamações solicitadas. Consulte OpenID Connect Core 1.0 para mais detalhes.

A Biblioteca de Autenticação da Microsoft (MSAL) para iOS e macOS permite solicitar reivindicações específicas tanto em cenários interativos como silenciosos de aquisição de tokens. Faz-no através do claimsRequest parâmetro.

Existem vários cenários em que isto é necessário. Por exemplo:

  • Solicitar declarações fora do conjunto padrão da sua aplicação.
  • Pedir combinações específicas das reivindicações padrão que não podem ser especificadas através dos âmbitos da sua aplicação. Por exemplo, se um token de acesso for rejeitado devido à ausência de reivindicações, a aplicação pode solicitar as reclamações em falta usando o MSAL.

Note

O MSAL contorna a cache do token de acesso sempre que um pedido de reclamação é especificado. É importante fornecer claimsRequest o parâmetro apenas quando são necessárias reivindicações adicionais (em vez de fornecer sempre o mesmo claimsRequest parâmetro em cada chamada de API MSAL).

claimsRequest pode ser especificado em MSALSilentTokenParameters e 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 pode ser construído a partir de uma representação NSString do pedido de Reivindicações JSON.

Objectivo-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)

Também pode ser modificado solicitando reivindicações específicas adicionais:

Objectivo-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 devem então ser definidos nos parâmetros do token e fornecidos a uma das APIs de aquisição de tokens MSAL:

Objectivo-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            ...