iOS ADAL - 使用刷新令牌进行静默调用



我正在使用iOS ADAL库版本2.2.6,并在成功登录后收到刷新令牌。现在,我想使用此刷新令牌进行静默调用。我尝试使用以下方法,但它无法返回访问令牌。

ADAuthenticationContext *authContext;              
[authContext acquireTokenSilentWithResource:resourceId
clientId:clientId
redirectUri:redirectUri
userId:strUserID //loggedIn userID
completionBlock:^(ADAuthenticationResult *result){ 
// It alway throws an error //Please call the non-silent acquireTokenWithResource methods.
if(result.error){
ADAuthenticationError *error = nil;
authContext = [ADAuthenticationContext authenticationContextWithAuthority:inputData.authority error:&error];
[authContext acquireTokenWithResource:inputData.ResourceID
clientId:inputData.ClientId                         // Comes from App Portal
redirectUri:inputData.RedirectUri // Comes from App Portal
completionBlock:^(ADAuthenticationResult *result)
{
if (AD_SUCCEEDED != result.status){
// Show alert with error description
}
else{
//Handle Success token
}
}];
}else{
//Handle Success token
}
}];

但它总是抛出一个错误,说"The user credentials are needed to obtain access token. Please call the non-silent acquireTokenWithResource methods."

有没有办法使用刷新令牌进行无声调用? 请帮我。提前谢谢。

使用 Microsoft 的身份验证库时,在提示用户登录之前,应始终首先检查缓存中是否有可用于资源的用户。这样,我们就可以检查用户之前是否登录过你的应用,或者是否有其他应用与你的应用共享状态,这些应用可能已要求用户在其他位置登录。

如果找到用户,我们将尝试在不中断用户的情况下获取令牌。有时,用户会更改其密码或执行其他操作,即使他们之前已登录过你的应用,也需要他们再次登录。这就是你所看到的。该库告诉您,对于您尝试为其获取令牌的用户,他们需要再次登录才能正确执行操作。

为了优雅地处理所有这些情况,我们建议您使用以下伪代码模式:

acquireTokenSilent()
(if error InteractiveAuthenticationRequired) {
acquireTokenInteractively() }

该模式首先检查您指定的用户在令牌缓存中是否可用。如果是,则调用 Azure Active Directory 服务以查看该用户的刷新令牌是否有效。如果这两个条件都为真,则用户将以静默方式登录。如果未找到用户或服务器拒绝刷新令牌,则会从库发送错误,指示用户需要以交互方式登录。

在上面,您正在执行第一部分,但您没有处理用户在出现问题时需要登录的情况。

最好的方法是以ADErrorCodeAD_ERROR_USER_INPUT_NEEDED捕获错误

下面是有关如何执行此模式的代码示例。

// Here we try to get a token from the stored user information we would have from a successful authentication
[authContext acquireTokenSilentWithResource:data.resourceId
clientId:data.clientId
redirectUri:redirectUri
userId:data.userItem.userInformation.userId
completionBlock:^(ADAuthenticationResult *result) {
if (!result.error)
{
completionBlock(result.tokenCacheStoreItem.userInformation, nil);
} else {
if ([result.error.domain isEqual:ADAuthenticationErrorDomain] && result.error.code == AD_ERROR_USER_INPUT_NEEDED) {
// Here we know that input is required because we couldn't get a token from the cache
[authContext acquireTokenWithResource:data.resourceId
           clientId:data.clientId
        redirectUri:redirectUri
             userId:data.userItem.userInformation.userId
    completionBlock:^(ADAuthenticationResult *result) {
        if (result.status != AD_SUCCEEDED)
        {
            completionBlock(nil, result.error);
        }
        else
        {
            data.userItem = result.tokenCacheStoreItem;
            completionBlock(result.tokenCacheStoreItem.userInformation, nil);
        }
    }];
} else {

completionBlock(nil, result.error);
}
}

}];

请记住,此代码非常冗长。您很可能希望acquireTokenWithResource:一个单独的方法,您可以使用[self acquireTokenWithResource]

相关内容

最新更新