大佬教程收集整理的这篇文章主要介绍了在iOS SDK中创建密码摘要,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我按照以下方式完成了:更新的代码:
NSString *user = @"XXXXXXXXXXXXXXXXXXXXXX"; NSNumber *nonce = @(arc4random()); NSLog(@"nonce %@",[self encodeStringTo64:[nonce stringValue]]); NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"]; NSString *created = [dateFormatter stringFromDate:[NSDate date]]; NSLog(@"created %@",created); NSString *digest_concat = [NSString stringWithFormat:@"%@%@%@",nonce,created,@"Pwd@123"]; NSData *digestBytes = [self shaa1:digest_concat]; NSString *digestBase64 = [self base64forData:digestBytes]; NSLog(@"digestBase64 %@",digestBase64); NSString *strSOAP = [NSString stringWithFormat:@"<soap:Envelope xmlns:soap=\"http://www.w3.org/2003/05/soap-envelope\" xmlns:v1=\"http://sita.aero/iborders/external/ReferralManagementServiceWSDLType/V1\"><soap:Header><wsse:Security xmlns:wsse=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd\" xmlns:wsu=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd\"><wsse:UsernameToken wsu:Id=\"UsernameToken-27E173B8CF239BE6F01440582357416191\"><wsse:Username>%@</wsse:Username><wsse:Password Type=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest\">%@</wsse:Password><wsse:Nonce EncodingType=\"http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary\">%@</wsse:Nonce><wsu:Created>%@</wsu:Created></wsse:UsernameToken></wsse:Security></soap:Header><soap:Body><v1:SearchReferralsRequest><v1:ReferralSearchCriteria><ReferralId>2038100</ReferralId></v1:ReferralSearchCriteria><v1:Paging><FetchNumber>1</FetchNumber><ResultsPerFetch>1</ResultsPerFetch></v1:Paging></v1:SearchReferralsRequest></soap:Body></soap:Envelope>",user,digestBase64,[self encodeStringTo64:[nonce stringValue]],created]; - (NSString*)encodeStringTo64:(NSString*)fromString{ NSData *plainData = [fromString dataUsingEncoding:NSUTF8StringEncoding]; NSString *base64String; if ([plainData respondsToSelector:@selector(base64EncodedStringWithOptions:)]) { base64String = [plainData base64EncodedStringWithOptions:kNilOptions]; // iOS 7+ } else { base64String = [plainData base64Encoding]; // pre iOS7 } return base64String; } - (NSData *)shaa1:(NSString *)input { NSData *data = [input dataUsingEncoding:NSUTF8StringEncoding]; uint8_t digest[CC_SHA1_DIGEST_LENGTH]; CC_SHA1(data.bytes,(CC_LONG) data.length,digest); return [NSData dataWithBytes:digest length:CC_SHA1_DIGEST_LENGTH];
}
有人可以检查我的代码创建nonce和密码摘要,让我知道我正在做什么错误,因为我无法使用此访问Web服务?我总是收到Message Expired错误.
错误:
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope"> <soap:Body> <soap:Fault> <soap:Code> <soap:Value>soap:Sender</soap:Value> <soap:Subcode> <soap:Value xmlns:ns1="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd">ns1:MessageExpired</soap:Value> </soap:Subcode> </soap:Code> <soap:Reason> <soap:Text xml:lang="en">The message has expired</soap:Text> </soap:Reason> </soap:Fault> </soap:Body> </soap:Envelope>
编辑:我想要的SOAP请求:
<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope" xmlns:v1="http://xxxxx/xxxx/external/ServiceWSDLType/V1"> <soap:Header> <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"> <wsse:UsernameToken wsu:Id="UsernameToken-XXXXX"> <wsse:Username>XXXXXXXXXXXXXXXXXXX</wsse:Username> <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordDigest">iAdbggkXsbNih5wBJ8M2tyyVWiA=</wsse:Password> <wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">b8SD2g2iiVvihx7ajVwPfw==</wsse:Nonce> <wsu:Created>2015-08-28T07:16:04.857Z</wsu:Created> </wsse:UsernameToken> </wsse:Security> </soap:Header> <soap:Body> <v1:SearchReferralsRequest> <v1:ReferralSearchCriteria> <ReferralId>213213</ReferralId> </v1:ReferralSearchCriteria> <v1:Paging> <FetchNumber>1</FetchNumber> <ResultsPerFetch>1</ResultsPerFetch> </v1:Paging> </v1:SearchReferralsRequest> </soap:Body> </soap:Envelope>
试试SHA1的这个功能:
- (NSData *)sha1:(NSString *)input { NSData *data = [input dataUsingEncoding:NSUTF8StringEncoding]; uint8_t digest[CC_SHA1_DIGEST_LENGTH]; CC_SHA1(data.bytes,digest); return [NSData dataWithBytes:digest length:CC_SHA1_DIGEST_LENGTH]; }
还要检查密码摘要中的时间值是否与wsu:Created相同.
更新#1
您还在密码摘要中使用base64 nonce,但在文档公式中是:
所以nonce必须是数字,而不是base64编码的数字.试试这个密码摘要代码:
NSNumber *nonce = @(arc4random()); NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"]; NSString *created = [dateFormatter stringFromDate:[NSDate date]]; NSString *digest_concat = [NSString stringWithFormat:@"%@%@%@",password];
更新#2
由于时区,您似乎已过期消息.从规范Web服务安全性:SOAP消息安全性1.1.1版:
使用UTC时区:
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"]; [dateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]]; NSString *created = [dateFormatter stringFromDate:[NSDate date]];
以上是大佬教程为你收集整理的在iOS SDK中创建密码摘要全部内容,希望文章能够帮你解决在iOS SDK中创建密码摘要所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。