iOS 客户端:我可以让用户登录 Active Directory,但如何访问 MS Graph API?
Posted
技术标签:
【中文标题】iOS 客户端:我可以让用户登录 Active Directory,但如何访问 MS Graph API?【英文标题】:iOS client: I can have user sign into Active Directory, but how to access MS Graph API? 【发布时间】:2016-09-21 13:58:42 【问题描述】:我正在开发一个需要从 MS Azure Active Directory 读取用户数据的 ios 应用。
我已经成功地按照 MS Azure 文档中有关 iOS 应用程序的一些示例,并成功打开了他们的身份验证页面并让用户登录。我得到的是 ADUserInformation 形式的一些用户数据 对象。
这是我的代码:
NSString *authority = @"https://login.microsoftonline.com/a5960f61-0bf9-4bf6-96cd-98c61d30XXXX/federationmetadata/2007-06/federationmetadata.xml"; NSString *resourceId = @"74cd2559-0389-4871-9904-bc767d71XXXX"; // (服务器) NSString *clientId = @"c8a956a7-84b7-4050-875c-896aab6bXXXX"; //ios-客户端(我们) NSURL *redirectUri = [[NSURL alloc]initWithString:@"https://XXXXevents.azurewebsites.net/.auth/login/done"]; ADAuthenticationError *错误; ADAuthenticationContext * authContext = [ADAuthenticationContext authenticationContextWithAuthority:authority error:&error]; //authContext.parentController = 父级; [ADAuthenticationSettings sharedInstance].enableFullScreen = YES; [authContext acquireTokenWithResource:resourceId 客户标识:客户标识 重定向Uri:redirectUri 完成块:^(ADAuthenticationResult *结果) 如果(结果。状态!= AD_SUCCEEDED) NSLog(@"%@", 结果); 返回; 别的 //将所有这些信息保存到核心数据中 NSDictionary * 有效负载 = @@"access_token" : result.tokenCacheItem.accessToken; NSLog(@"%@", 有效载荷); //@"aad" //@"windowsazureactivedirectory" [[QSActivityService defaultService].client loginWithProvider:@"aad" 令牌:有效载荷 完成:^(MSUser * _Nullable 用户,NSError * _Nullable 错误) NSLog(@"loginWithProvider-----"); 如果(!错误) NSLog(@"YAY! %s - 用户: %@ ", __FUNCTION__, user.userId); ADUserInformation * temp = result.tokenCacheItem.userInformation; [[CoreDataStack defaultStack] updateUserDetailFamilyName:temp.allClaims[@"family_name"] 版本:temp.allClaims[@"ver"] 电子邮件:temp.allClaims[@"email"] nbf:temp.allClaims[@"nbf"] exp:temp.allClaims[@"exp"] givenName:temp.allClaims[@"given_name"] idp:temp.allClaims[@"idp"] ipaddr:temp.allClaims[@"ipaddr"] iss:temp.allClaims[@"iss"] oid:temp.allClaims[@"oid"] typ:temp.allClaims[@"typ"] sub:temp.allClaims[@"sub"] amr:temp.allClaims[@"amr"] aud:temp.allClaims[@"aud"] alg:temp.allClaims[@"alg"] iat:temp.allClaims[@"iat"] tid:temp.allClaims[@"tid"] 名称:temp.allClaims[@"name"] uniqueName:temp.allClaims[@"unique_name"]]; //其他代码,这里没有问题MS 图形 API
但是,我想访问个人资料图片和所有其他数据。我读过 MS Graph API 提供了它,但我不确定如何以及在哪里放置令牌。
我是否使用来自 result.tokenCacheItem.accessToken 的令牌?如果是这样,在标题中?还是身体?
或者我是否只需访问 graph.windows.com 两次。第一次获取Authentication Token,第二次获取数据?
我已经阅读了很多文档,但由于我不断收到 Token Missing or Malformed 错误消息,它们都不起作用。
我的 Graph API 代码如下所示:
-(void)getUsersUsingAccessToken:(NSDictionary*)token 完成:(void (^) (void))completion NSString * 租户 = @"a5960f61-0bf9-4bf6-96cd-98c61d306f12"; NSString * accessToken = token[@"access_token"]; NSString * urlString = [NSString stringWithFormat:@"https://graph.windows.net/%@/tenantDetails?api-version=1.6", 租户]; NSString * httpVerb = @"POST"; //构建一个信息对象并转换为json NSDictionary * bodyFormDict = [NSDictionary 字典WithObjectsAndKeys: @"client_credentials", @"grant_type", @"https://graph.windows.net", @"资源", @"c8a956a7-84b7-4050-875c-896aab6xxxx", @"client_id", @"XLlZl69aUKiQTo4dpeiprItm+LYbDtpt6e9dn0bxxxx", @"client_secret", 零]; NSError *error = nil; //第一步 NSData * jsonInputData = [NSJSONSerialization dataWithJSONObject:bodyFormDict 选项:NSJSONWritingPrettyPrinted 错误:&错误]; //第二步 NSString * httpBodyString = [[NSString alloc] initWithData:jsonInputData 编码:NSUTF8StringEncoding]; NSURLSessionConfiguration *sessionConfiguration = [NSURLSessionConfiguration defaultSessionConfiguration]; sessionConfiguration.allowsCellularAccess = YES; self.session = [NSURLSession sessionWithConfiguration:sessionConfiguration]; NSMutableURLRequest * request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:urlString]]; 请求.HTTPMethod = httpVerb; [请求 setValue:@"application/json; charset=utf-8" forHTTPHeaderField:@"Content-Type"]; [request setValue: accessToken forHTTPHeaderField:@"Authorization: Bearer"]; [请求 setHTTPBody:[httpBodyString dataUsingEncoding:NSUTF8StringEncoding]]; //异步 NSURLSessionDataTask * getDataTask = [self.session dataTaskWithRequest:request completionHandler:^(NSData * _Nullable 数据, NSURLResponse * _Nullable 响应, NSError * _Nullable 错误) //其他代码如果有人可以提供使用目标 c 的工作代码示例以成功从 MS Graph API 检索数据,那将是一个很大的帮助。
感谢您的宝贵时间!
【问题讨论】:
嗨,我还尝试在我们的应用程序中加入 SSO 身份验证 - 使用 Azure Active Directory 进行身份验证。你能给我推荐一些有用的链接吗?谢谢。 嗨克莱门特,msdn.microsoft.com/en-us/office/office365/howto/… 【参考方案1】:我在 MS MSDN 的入门项目和代码示例中找到了我的答案
https://msdn.microsoft.com/en-us/office/office365/howto/starter-projects-and-code-samples
帮助我的具体项目是这样的: https://github.com/OfficeDev/O365-iOS-Microsoft-Graph-Profile
当您浏览该示例时,请记住:
替换 INSERT-AUTHORITY-HERE - 您在其中配置应用程序的租户的名称。格式应为https://login.windows.net/(YourAzureUserName).onmicrosoft.com
我发现 https://login.microsoftonline.com/YourAzureAccountID/federationmetadata/2007-06/federationmetadata.xml
也可以
替换 INSERT-RESOURCE-ID-HERE - 您的移动应用后端的 ID。这是 Web API 服务应用程序 ID。不是本机客户端 iOS 应用。
替换 INSERT-CLIENT-ID-HERE - 您从 iOS NATIVE 客户端应用程序复制的客户端 ID。不是 Web API 服务应用程序。
使用 HTTPS 方案替换 INSERT-REDIRECT-URI-HERE - 您网站的 /.auth/login/done 端点。这个值应该类似于 @"https://XXXXXXXXXX.azurewebsites.net/.auth/login/done"
如果您在导入 ADAL 框架时遇到问题...
http://shanghaiseagull.com/index.php/2016/05/11/import-another-project-framework-into-your-project/
库可以在这里找到:https://github.com/AzureAD/azure-activedirectory-library-for-objc
希望它对刚开始的人有所帮助...如果我能提供进一步的帮助,请告诉我。
【讨论】:
【参考方案2】:我相信您遇到的问题是 http 标头字段设置不正确。试试这个 -
NSString *authValue = [NSString stringWithFormat:@"Bearer %@", accessToken];
[request setValue:authValue forHTTPHeaderField:@"Authorization"];
【讨论】:
以上是关于iOS 客户端:我可以让用户登录 Active Directory,但如何访问 MS Graph API?的主要内容,如果未能解决你的问题,请参考以下文章
如何通过Powershell在域计算机上查询Active Directory而不在客户端计算机上安装RSAT工具
我如何获得Azure Active Directory B2c登录用户角色?
如何使用 Cypress.io 使用 MS Active Directory 登录?