AliyunOSSSDK/Signer/OSSV1Signer.m (89 lines of code) (raw):

// // OSSV1Signer.m // AliyunOSSSDK // // Created by ws on 2023/12/26. // Copyright © 2023 aliyun. All rights reserved. // #import "OSSV1Signer.h" #import "OSSModel.h" #import "OSSAllRequestNeededMessage.h" #import "OSSSignUtils.h" #import "OSSSignerParams.h" #import "OSSServiceSignature.h" #import "OSSDefine.h" #import "NSDate+OSS.h" #import "NSMutableDictionary+OSS.h" @implementation OSSV1Signer - (void)addAuthorizationHeader:(OSSAllRequestNeededMessage *)request federationToken:(OSSFederationToken *)federationToken { NSString *canonicalString = [self buildStringToSign:request]; NSString *signature = [[HmacSHA1Signature new] computeSignature:federationToken.tSecretKey data:canonicalString]; request.headerParams[OSSHttpHeaderAuthorization] = [OSSSignUtils composeRequestAuthorization:federationToken.tAccessKey signature:signature]; } - (OSSTask *)presign:(OSSAllRequestNeededMessage *)requestMessage { NSMutableDictionary *params = requestMessage.params.mutableCopy; id<OSSCredentialProvider> credentialProvider = self.signerParams.credentialProvider; OSSFederationToken *federationToken; NSError * error = nil; if ([credentialProvider isKindOfClass:[OSSFederationCredentialProvider class]]) { federationToken = [(OSSFederationCredentialProvider *)credentialProvider getToken:&error]; if (error) { return [OSSTask taskWithError:error]; } } else if ([credentialProvider isKindOfClass:[OSSStsTokenCredentialProvider class]]) { federationToken = [(OSSStsTokenCredentialProvider *)credentialProvider getToken]; #pragma clang diagnostic push #pragma clang diagnostic ignored "-Wdeprecated-declarations" } else if ([credentialProvider isKindOfClass:[OSSPlainTextAKSKPairCredentialProvider class]]) { federationToken = [[OSSFederationToken alloc] init]; federationToken.tAccessKey = ((OSSPlainTextAKSKPairCredentialProvider *)credentialProvider).accessKey; federationToken.tSecretKey = ((OSSPlainTextAKSKPairCredentialProvider *)credentialProvider).secretKey; } #pragma clang diagnostic pop NSString *canonicalResource = self.signerParams.resourcePath; NSString * expires = [@((int64_t)[[NSDate oss_clockSkewFixedDate] timeIntervalSince1970] + self.signerParams.expiration) stringValue]; if (federationToken.useSecurityToken) { [params oss_setObject:federationToken.tToken forKey:@"security-token"]; } requestMessage.params = params; requestMessage.headerParams[OSSHttpHeaderDate] = expires; NSString *canonicalString = [OSSSignUtils buildCanonicalString:requestMessage.httpMethod resourcePath:canonicalResource request:requestMessage expires:expires]; NSString *signature; NSString *accessKey = federationToken.tAccessKey; if ([credentialProvider isKindOfClass:[OSSCustomSignerCredentialProvider class]]) { NSString *wholeSign = [(OSSCustomSignerCredentialProvider *)credentialProvider sign:canonicalString error:&error]; NSArray * splitResult = [wholeSign componentsSeparatedByString:@":"]; if ([splitResult count] != 2 || ![((NSString *)[splitResult objectAtIndex:0]) hasPrefix:@"OSS "]) { return [OSSTask taskWithError:[NSError errorWithDomain:OSSClientErrorDomain code:OSSClientErrorCodeSignFailed userInfo:@{OSSErrorMessageTOKEN: @"the returned signature is invalid"}]]; } accessKey = [(NSString *)[splitResult objectAtIndex:0] substringFromIndex:4]; signature = [splitResult objectAtIndex:1]; } else { if (federationToken == nil) { return [OSSTask taskWithError:[NSError errorWithDomain:OSSClientErrorDomain code:OSSClientErrorCodeSignFailed userInfo:@{OSSErrorMessageTOKEN: @"Can't get a federation token"}]]; } signature = [[HmacSHA1Signature new] computeSignature:federationToken.tSecretKey data:canonicalString]; } if (error) { return [OSSTask taskWithError:error]; } [params oss_setObject:expires forKey:OSSRequestParameterExpires]; [params oss_setObject:accessKey forKey:OSSRequestParameterAccessKeyId]; [params oss_setObject:signature forKey:OSSRequestParameterSignature]; requestMessage.params = params; return [OSSTask taskWithResult:nil]; } - (NSString *)buildStringToSign:(OSSAllRequestNeededMessage *)request { NSString *canonicalString = [OSSSignUtils buildCanonicalString:request.httpMethod resourcePath:self.signerParams.resourcePath request:request expires:nil]; return canonicalString; } @end