Żądanie niestandardowych claimów za pomocą biblioteki MSAL dla systemów iOS i macOS

OpenID Connect umożliwia opcjonalne żądanie zwrotu poszczególnych oświadczeń z punktu końcowego UserInfo i/lub w tokenie identyfikatora. Żądanie oświadczeń jest reprezentowane jako obiekt JSON, który zawiera listę żądanych oświadczeń. Aby uzyskać więcej informacji, zobacz OpenID Connect Core 1.0 .

Microsoft Authentication Library (MSAL) dla systemów iOS i macOS umożliwia żądanie określonych oświadczeń zarówno w scenariuszach pozyskiwania tokenów interakcyjnych, jak i dyskretnych. Robi to za pośrednictwem parametru claimsRequest .

Istnieje wiele scenariuszy, w których jest to konieczne. Przykład:

  • Żądanie uprawnień wykraczających poza standardowy zestaw dla Twojej aplikacji.
  • Żądanie określonych kombinacji standardowych oświadczeń, których nie można określić przy użyciu zakresów dla aplikacji. Jeśli na przykład token dostępu zostanie odrzucony z powodu braku oświadczeń, aplikacja może zażądać brakujących oświadczeń przy użyciu biblioteki MSAL.

Note

Biblioteka MSAL pomija pamięć podręczną tokenu dostępu za każdym razem, gdy zostanie określone żądanie oświadczeń. Ważne jest, aby podać claimsRequest parametr tylko wtedy, gdy potrzebne są dodatkowe oświadczenia (w przeciwieństwie do zawsze podawania tego samego claimsRequest parametru w każdym wywołaniu interfejsu API biblioteki MSAL).

claimsRequest można określić w parametrach MSALSilentTokenParameters i 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 można utworzyć z reprezentacji NSString żądania deklaracji 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)

Można go również zmodyfikować, żądając dodatkowych oświadczeń:

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 należy następnie ustawić w parametrach tokenu i przekazać do jednego z interfejsów API biblioteki MSAL służących do uzyskiwania tokenów:

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