iOS および macOS 用の MSAL を使用してカスタム要求を要求する

OpenID Connect を使用すると、必要に応じて、UserInfo エンドポイントまたは ID トークンから個々の要求の返しを要求できます。 要求要求は、要求された要求の一覧を含む JSON オブジェクトとして表されます。 詳細については、 OpenID Connect Core 1.0 を参照してください。

iOS および macOS 用の Microsoft Authentication Library (MSAL) を使用すると、対話型トークン取得シナリオとサイレント トークン取得シナリオの両方で特定の要求を要求できます。 これは、 claimsRequest パラメーターを使用して行います。

これが必要なシナリオは複数あります。 例えば次が挙げられます。

  • アプリケーションの標準セットに含まれないクレームを要求しています。
  • アプリケーションのスコープを使用して指定できない標準要求の特定の組み合わせを要求する。 たとえば、要求がないためにアクセス トークンが拒否された場合、アプリケーションは MSAL を使用して不足している要求を要求できます。

Note

MSAL は、要求要求が指定されるたびにアクセス トークン キャッシュをバイパスします。 追加の要求が必要な場合にのみ claimsRequest パラメーターを指定することが重要です (各 MSAL API 呼び出しで常に同じ claimsRequest パラメーターを提供するのとは対照的です)。

claimsRequest は、 MSALSilentTokenParameters および 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 は、JSON 要求の NSString 表現から構築できます。

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)

また、追加の特定の要求を要求することで変更することもできます。

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 次に、トークン パラメーターを設定し、MSAL トークン取得 API のいずれかに提供する必要があります。

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