Alibaba Cloud Function Compute Signature Authentication (Bemerkungen zur iOS-Implementierungsdetails)

1. Verwenden Sie die Drittanbieterbibliothek AFNetworking, um Netzwerkanfragen zu stellen.
2. Alibaba Cloud Function Compute Signature Authentication Document
3. Das Hinzufügen von CanonicalizedFCHeaders zum Dokument muss nicht hinzugefügt werden. Wenn CanonicalizedResource den Pfad nicht festlegt, fügen Sie einfach „/“ am Ende hinzu.
4. Das Hauptproblem ist die hmac-sha256-Signaturauthentifizierung, die während des Implementierungsprozesses in base64 konvertiert wird.
Das Folgende ist der Implementierungscode:

+ (AFHTTPSessionManager *)httpSessionManager:(NSString *)url{
    AFHTTPSessionManager *sessionManager = [[AFHTTPSessionManager alloc] initWithBaseURL:[NSURL URLWithString:url]];
    sessionManager.requestSerializer = [AFJSONRequestSerializer serializer];
    sessionManager.responseSerializer = [AFJSONResponseSerializer serializer];
    sessionManager.responseSerializer.acceptableContentTypes = [NSSet setWithObjects:@"application/json", nil];
    [sessionManager.requestSerializer setValue:[YTDWindingCalculatorHttp aliSignature:sessionManager] forHTTPHeaderField:@"Authorization"];
    return sessionManager;
}

+ (NSString *)aliSignature:(AFHTTPSessionManager *)sessionManager{
    NSString *accessKeyID = @"xxxxxx";
    NSString *accessKeySecret = @"xxxx";
    NSString *authorization = [NSString stringWithFormat:@"FC %@:",accessKeyID];
    NSMutableArray *signatureArray = [NSMutableArray array];
    [signatureArray addObject:@"POST"];
    [signatureArray addObject:@""];
    [signatureArray addObject:@"application/json"];
    NSString *date = [YTDWindingCalculatorHttp rfc1123String];
    [signatureArray addObject:date];
    [signatureArray addObject:@"/\n"];
    
    //请求头添加content-type 和 date
    [sessionManager.requestSerializer setValue:sessionManager.responseSerializer.acceptableContentTypes.allObjects.firstObject forHTTPHeaderField:@"content-type"];
    [sessionManager.requestSerializer setValue:date forHTTPHeaderField:@"date"];

    NSString *signature = [signatureArray componentsJoinedByString:@"\n"];
    signature = [YTDWindingCalculatorHttp hmac:signature withKey:accessKeySecret];
    
    authorization = [NSString stringWithFormat:@"%@%@",authorization,signature];
    return authorization;
}

+ (NSString *)hmac:(NSString *)content withKey:(NSString *)secret{
    const char *cKey  = [secret cStringUsingEncoding:NSUTF8StringEncoding];
    const char *cData = [content cStringUsingEncoding:NSUTF8StringEncoding];// 有可能有中文 所以用NSUTF8StringEncoding -> NSASCIIStringEncoding
    unsigned char cHMAC[CC_SHA256_DIGEST_LENGTH];
    CCHmac(kCCHmacAlgSHA256, cKey, strlen(cKey), cData, strlen(cData), cHMAC);
    NSData *HMACData = [NSData dataWithBytes:cHMAC length:sizeof(cHMAC)];
    NSData *base64Data = [HMACData base64EncodedDataWithOptions:NSDataBase64Encoding64CharacterLineLength];
    return [[NSString alloc] initWithData:base64Data encoding:NSUTF8StringEncoding];
}

+ (NSString *)rfc1123String{
    time_t date = (time_t)[[NSDate date] timeIntervalSince1970];
    struct tm timeinfo;
    gmtime_r(&date, &timeinfo);
    char buffer[32];
    size_t ret = strftime_l(buffer, sizeof(buffer), "%a, %d %b %Y %H:%M:%S GMT", &timeinfo, NULL);
    if (ret) {
        return @(buffer);
    } else {
        return nil;
    }
}

Guess you like

Origin blog.csdn.net/sky_long_fly/article/details/131892688