iOS ADAL - 使用刷新令牌进行静默调用
iOS ADAL-Make silent call using refresh token
我正在使用 iOS ADAL 库版本 2.2.6 并在成功登录后收到刷新令牌。现在我想通过使用此刷新令牌进行静默调用。我尝试使用以下方法,但无法 return 访问令牌。
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."
有什么方法可以使用刷新令牌进行静默调用吗?请帮助我。提前致谢。
当您使用微软的身份验证库时,在提示用户登录之前,您应该始终首先检查缓存中是否存在可用于您的资源的用户。这使我们能够检查用户是否之前已登录到您的应用程序,或者如果有其他应用程序与您的应用程序共享状态,这些应用程序可能已经要求用户在其他地方登录。
如果找到用户,我们将尝试在完全不打扰用户的情况下获取令牌。有时,用户会更改密码或执行一些其他操作,这将要求他们重新登录,即使他们之前已登录到您的应用程序也是如此。这就是你所看到的。 图书馆告诉您,对于您尝试为其获取令牌的用户,他们需要重新登录才能做出正确的决定。
为了优雅地处理所有这些情况,我们建议您使用以下伪代码模式:
acquireTokenSilent()
(if error InteractiveAuthenticationRequired) {
acquireTokenInteractively() }
该模式首先检查您指定的用户是否在令牌缓存中可用。如果是,我们将调用 Azure Active Directory 服务来查看该用户的刷新令牌是否有效。如果这两个都为真,则用户以静默方式登录。如果找不到用户或服务器拒绝刷新令牌,则会从库中发送一个错误,指示用户需要以交互方式登录。
在上面,您执行的是第一部分,但您没有处理出现问题时用户需要登录的情况。
最好的方法是用 ADErrorCode
的 AD_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]
调用它
我正在使用 iOS ADAL 库版本 2.2.6 并在成功登录后收到刷新令牌。现在我想通过使用此刷新令牌进行静默调用。我尝试使用以下方法,但无法 return 访问令牌。
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."
有什么方法可以使用刷新令牌进行静默调用吗?请帮助我。提前致谢。
当您使用微软的身份验证库时,在提示用户登录之前,您应该始终首先检查缓存中是否存在可用于您的资源的用户。这使我们能够检查用户是否之前已登录到您的应用程序,或者如果有其他应用程序与您的应用程序共享状态,这些应用程序可能已经要求用户在其他地方登录。
如果找到用户,我们将尝试在完全不打扰用户的情况下获取令牌。有时,用户会更改密码或执行一些其他操作,这将要求他们重新登录,即使他们之前已登录到您的应用程序也是如此。这就是你所看到的。 图书馆告诉您,对于您尝试为其获取令牌的用户,他们需要重新登录才能做出正确的决定。
为了优雅地处理所有这些情况,我们建议您使用以下伪代码模式:
acquireTokenSilent()
(if error InteractiveAuthenticationRequired) {
acquireTokenInteractively() }
该模式首先检查您指定的用户是否在令牌缓存中可用。如果是,我们将调用 Azure Active Directory 服务来查看该用户的刷新令牌是否有效。如果这两个都为真,则用户以静默方式登录。如果找不到用户或服务器拒绝刷新令牌,则会从库中发送一个错误,指示用户需要以交互方式登录。
在上面,您执行的是第一部分,但您没有处理出现问题时用户需要登录的情况。
最好的方法是用 ADErrorCode
的 AD_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]