我正在尝试在iOS应用中使用ADALiOS。我还希望有一个注销按钮,以便在需要时,用户可以选择从应用程序注销。我认为最好的方法是撤销刷新令牌(访问令牌是短暂的,并且不能被撤销),理想情况下,它也应该撤销令牌并在服务器端进行清理。 / p>
我尝试了Azure AD文档,在源代码中搜索(一般在其他地方搜索过),但在ADAL中找不到任何提醒刷新令牌的撤销。
可以在ADAL中撤消刷新令牌吗?记录用户的最佳方法是什么?
答案 0 :(得分:3)
是。来自Best Practices for OAuth 2.0 in Azure AD
:
刷新令牌没有指定的生命周期。通常, 刷新令牌的生命周期相对较长。 然而,在一些 案例,刷新令牌过期,被撤销或缺乏足够的 所需行动的特权。客户端应用程序需要 期望并处理令牌颁发端点返回的错误 正确。当您收到带有刷新令牌错误的响应时, 丢弃当前刷新令牌并请求新的授权码 或访问令牌。特别是在使用刷新令牌时 授权代码授予流程,如果您收到响应 interaction_required或invalid_grant错误代码,放弃刷新 令牌并请求新的授权码。
我还记得维托里奥在他的博客文章(ADAL 3 didn’t return refresh tokens for ~5 months… and nobody noticed
)中提到,ADAL 3甚至没有返回刷新令牌。我想一般建议不要在你的应用程序中依赖刷新令牌。
关于注销用户,请参阅此主题:ADAL: W8.1 app trying to log user out,尽管此主题适用于Windows Phone应用程序。
答案 1 :(得分:1)
根据Gaurav提供的链接,以下是ADAD Objective-c的注销代码,适用于Azure AD提供的示例应用程序:
在viewcontroller中:
- (IBAction)logoutUser:(id)sender
{
[self.unifiedEndpointClient logoutUser];
}
在O365UnifiedEndpointOperations中:
-(void)logoutUser
{
AuthenticationManager *authenticationManager = [AuthenticationManager sharedInstance];
[authenticationManager removeTokenWithResourceId:_resourceID
withTenant:TENANT_STRING];
}
在AuthenticationManager中:
-(void) removeTokenWithResourceId:(NSString *)resourceId
withTenant:(NSString *)tenant
{
[self.authContext.tokenCacheStore removeAllWithError:nil];
NSURLSession *urlSession = [NSURLSession sessionWithConfiguration: [NSURLSessionConfiguration defaultSessionConfiguration]
delegate: nil
delegateQueue: [NSOperationQueue mainQueue]];
NSURL *url = [NSURL URLWithString: [NSString stringWithFormat: @"https://login.windows.net/%@/oauth2/logout", tenant]];
[[urlSession dataTaskWithURL:url
completionHandler:^(NSData *data, NSURLResponse *response, NSError *error)
{
}] resume];
}