使用 AFNetworking 在 iOS 8 中登录时解析服务器提供未经授权的 (401)

Posted

技术标签:

【中文标题】使用 AFNetworking 在 iOS 8 中登录时解析服务器提供未经授权的 (401)【英文标题】:Parse server giving unauthorised (401) while login in iOS 8 using AFNetworking 【发布时间】:2015-03-09 09:51:46 【问题描述】:

您好,我正在开发用于在解析服务器中保存数据的 ios 同步组件,我从解析 Web 端创建了一个类,并将该类命名为 TicketDetail,并添加了一些带有数据的字段,但是当我尝试从我的使用带有链接https://api.parse.com/1/ 的AFNetworking GET 请求的应用程序还通过AFHTTPRequestOperation 将AppID 和客户端密钥作为标头字段传递。在发出请求之前,我正在使用以下代码检查用户是否已在 parse.com 上注册

    [PFUser logInWithUsernameInBackground:username password:password
                                    block:^(PFUser *user, NSError *error) 
                                        if (user) 
                                            // Do stuff after successful login.
                                            NSLog(@"%@",user);
                                            NSLog(@"%@",user.email);
                                            NSLog(@"%@",user.username);
                                            [[AFSyncEngine sharedInstance] startSync];

                                         else 
                                            NSLog(@"The login failed. Check error to see why");
                                            UIAlertView *_alert = [[UIAlertView alloc]initWithTitle:@"Unauthorised User" message:@"Would you like to SignUp" delegate:self cancelButtonTitle:@"Cancel" otherButtonTitles:@"SignUp", nil];
                                            _alert.tag=89;
                                            [_alert show];
                                            ;
                                    ];

如果用户没有被授权,他们我使用下面的代码注册用户

PFUser *newUser = [PFUser user];
[newUser setUsername:self.userNameFld.text];
[newUser setEmail:self.emailIdFld.text];
[newUser setPassword:self.passwordFld.text];
[newUser signUpInBackgroundWithBlock:^(BOOL succeeded, NSError *error) 
    if (succeeded) 
        NSLog(@"Registered");
        [[[UIAlertView alloc]initWithTitle:@"SignUp" message:@"Successfull" delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil, nil]show];
    
    else 
        NSLog(@"%@",error);
    
];

一旦用户注册并尝试登录,这就是我从解析服务器得到的响应

2015-03-09 14:44:49.742 MyDetails[2360:1369317] 错误 Domain=com.alamofire.error.serialization.response Code=-1011 “请求失败:未授权 (401)” UserInfo=0x7fbf585c0f40 com.alamofire.serialization.response.error.response= 网址:https://api.parse.com/1/classes/TicketDetail 状态码:401, 标题 "访问控制允许方法" = ""; "访问控制允许来源" = ""; 连接=“保持活动”; “内容长度”= 25; “内容类型”=“应用程序/json;字符集=utf-8”; 日期 = “星期一,2015 年 3 月 9 日 09:14:47 GMT”; 服务器=“nginx/1.6.0”; "Www-Authenticate" = "基本领域=\"解析\""; “X-解析平台”= G1; “X-运行时间”=“0.000162”; , NSErrorFailingURLKey=https://api.parse.com/1/classes/TicketDetail, com.alamofire.serialization.response.error.data=, NSLocalizedDescription=请求失败:未授权 (401)

如果有人在 parse.com 和 AFNetworking 工作,请帮助我

【问题讨论】:

【参考方案1】:

在 AFNetworking 中,您需要为 https 请求添加安全策略。

AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];
securityPolicy.allowInvalidCertificates = YES;
self.securityPolicy = securityPolicy;
self.requestSerializer = [AFJSONRequestSerializer serializer];
self.responseSerializer = [AFJSONResponseSerializer serializer];

【讨论】:

这就是我的工作方式,但仍然没有解决 AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeNone];securityPolicy.allowInvalidCertificates = YES;self.securityPolicy = securityPolicy;[self setRequestSerializer:[AFJSONRequestSerializer 序列化程序]];self.responseSerializer = [AFHTTPResponseSerializer 序列化器];[self.requestSerializer setValue:@"X-Parse-Application-Id" forHTTPHeaderField:kParseAPIApplicationId]; [self.requestSerializer setValue:@"X-Parse-REST-API-Key" forHTTPHeaderField:kParseAPIKey]; 如果上面的方法不行你多半是使用了错误的App ID和Client Key。

以上是关于使用 AFNetworking 在 iOS 8 中登录时解析服务器提供未经授权的 (401)的主要内容,如果未能解决你的问题,请参考以下文章

iOS 8 扩展的 AFNetworking 后台会话配置

ios json 解析与 afnetworking

在 iOS 5 中使用 AFNetworking 解析 JSON

IOS开发之application/x-www-form-urlencoded ;charset=utf-8

在swift ios中使用AFNetworking上传图片

无法在 ios 中使用 afnetworking 发布 JSON