QCloudAuthentationHeadV5Creator.m 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. //
  2. // QCloudAuthentationHeadV5Creator.m
  3. // TCLVBIMDemo
  4. //
  5. // Created by carolsuo on 2017/10/24.
  6. // Copyright © 2017年 tencent. All rights reserved.
  7. //
  8. #import "QCloudAuthentationHeadV5Creator.h"
  9. #import <QCloudCore/QCloudSignature.h>
  10. #import <QCloudCore/QCloudCredential.h>
  11. #import <QCloudCore/QCloudSignatureFields.h>
  12. #import <QCloudCore/QCloudHTTPRequest.h>
  13. #import <QCloudCore/QCloudRequestSerializer.h>
  14. #import <QCloudCore/NSString+QCloudSHA.h>
  15. #import <CommonCrypto/CommonDigest.h>
  16. @implementation QCloudAuthentationHeadV5Creator
  17. - (instancetype) initWithSignKey:(NSString *) secretID
  18. signKey:(NSString *) signKey
  19. keyTime:(NSString *) keyTime
  20. {
  21. self = [super init];
  22. if (!self) {
  23. return self;
  24. }
  25. _secretID = secretID;
  26. _signKey = signKey;
  27. _keyTime = keyTime;
  28. return self;
  29. }
  30. - (void) setSignKey:(NSString *) secretID
  31. signKey:(NSString *) signKey
  32. keyTime:(NSString *) keyTime;
  33. {
  34. _secretID = secretID;
  35. _signKey = signKey;
  36. _keyTime = keyTime;
  37. }
  38. - (QCloudSignature*) signatureForData:(NSMutableURLRequest *)urlrequest
  39. {
  40. NSDictionary* headers = [urlrequest allHTTPHeaderFields];
  41. NSDictionary* urlParamters = QCloudURLReadQuery(urlrequest.URL);
  42. NSDictionary* (^LowcaseDictionary)(NSDictionary* origin) = ^(NSDictionary* origin) {
  43. NSMutableDictionary* aim = [NSMutableDictionary new];
  44. NSArray* allKeys = origin.allKeys;
  45. for (NSString* key in allKeys) {
  46. NSString* transKey = key;
  47. if (![key isKindOfClass:[NSString class]]) {
  48. transKey = [NSString stringWithFormat:@"%@",key];
  49. }
  50. NSString* value = origin[key];
  51. aim[transKey.lowercaseString] = value;
  52. }
  53. return [aim copy];
  54. };
  55. // Step1 构成FormatString
  56. NSString* headerFormat = QCloudURLEncodeParamters(LowcaseDictionary(headers), YES, NSUTF8StringEncoding);
  57. NSString* urlFormat = QCloudURLEncodeParamters(LowcaseDictionary(urlParamters), YES, NSUTF8StringEncoding);
  58. NSMutableString* formatString = [NSMutableString new];
  59. void(^AppendFormatString)(NSString*) = ^(NSString* part) {
  60. [formatString appendFormat:@"%@\n",part];
  61. };
  62. AppendFormatString(urlrequest.HTTPMethod.lowercaseString);
  63. NSString* path = urlrequest.URL.path;
  64. if (path.length == 0) {
  65. path = @"/";
  66. }
  67. AppendFormatString(path);
  68. AppendFormatString(urlFormat);
  69. AppendFormatString(headerFormat);
  70. NSString* formatStringSHA = [formatString qcloud_sha1];
  71. // step 2 计算StringToSign
  72. NSString* stringToSign = [NSString stringWithFormat:@"%@\n%@\n%@\n", @"sha1", _keyTime , formatStringSHA];
  73. // step 3 计算签名
  74. NSString* signature = [NSString qcloudHMACHexsha1:stringToSign secret:_signKey];
  75. // step 4 构造Authorization
  76. NSString* (^DumpAllKeys)(NSDictionary*) = ^(NSDictionary* info) {
  77. NSArray* keys = info.allKeys;
  78. NSMutableArray* redirectKeys = [NSMutableArray new];
  79. for (NSString* key in keys) {
  80. [redirectKeys addObject:key.lowercaseString];
  81. }
  82. [redirectKeys sortUsingComparator:^NSComparisonResult(id _Nonnull obj1, id _Nonnull obj2) {
  83. return [obj1 compare:obj2];
  84. }];
  85. NSString* keyString = @"";
  86. for (int i = 0; i < redirectKeys.count; i ++) {
  87. keyString = [keyString stringByAppendingString:redirectKeys[i]];
  88. if (i < (int)redirectKeys.count -1) {
  89. keyString = [keyString stringByAppendingString:@";"];
  90. }
  91. }
  92. return keyString;
  93. };
  94. //key有效期
  95. NSString* authoration = [NSString stringWithFormat:@"q-sign-algorithm=sha1&q-ak=%@&q-sign-time=%@&q-key-time=%@&q-header-list=%@&q-url-param-list=%@&q-signature=%@", _secretID, _keyTime, _keyTime, DumpAllKeys(headers), DumpAllKeys(urlParamters) ,signature];
  96. QCloudLogDebug(@"authoration is %@", authoration);
  97. return [QCloudSignature signatureWith1Day:authoration];
  98. }
  99. @end