justinm1/s3signeraws
Generates V4 authorization headers and pre-signed URLs for authenticating AWS S3 REST API calls
Table of Contents
Integration
Swift Package Manager
To install with swift package manager, add the package to your Package.swift file:
Import PackageDescription
let package = Package(
name: "Your_Project_Name",
targets: [],
dependencies: [
.package(url: "https://github.com/JustinM1/S3SignerAWS.git", from: "4.0.0")
]
)
```Usage
NOTE ABOUT PAYLOAD:
Requests can either have a signed payload or an unsigned payload.
- If you know the request will not have a payload, set the Payload property to none. This tells s3 that the signature was created with no payload intended
- If you are not sure what the exact payload will be, set payload property to unsigned. This tells s3 when you made the signature, there was a possibility of a payload but you weren't sure what specific object will be uploaded.
Payloadenum:
``ruby public enum Payload { case data(Data) case none case unsigned } `` To begin working with the S3SignerAWS class, initialize an instance similar to example shown below:
let s3Signer = S3SignerAWS(accessKey: "YOUR_AWS_PUBLIC_KEY", secretKey: "YOUR_AWS_SECRET_KEY", region: .usStandard_usEast1) NOTE - Hardcoding Secret Keys on client is not recommended for security reasons.
V4 Authorization Header
For both V4 Authorization Header and Pre-Signed URL, you can add additional headers as needed for your specific use case.
GET
do {
guard let url = URL(string: "https://s3.amazonaws.com/bucketName/testUploadImage.png") else { throw someError }
let headers = try s3Signer.authHeaderV4(httpMethod: .get, urlString: url.absoluteString, headers: [:], payload: .none)
var request = URLRequest(url: url)
request.httpMethod = HTTPMethod.get.rawValue
headers.forEach { request.setValue($0.key, forHTTPHeaderField: $0.value) }
// make network request
} catch {
//handle error
}
}
```
PUT
do { let bytesObject = try someDataObject.makeBytes() guard let url = URL(string: "https://s3.amazonaws.com/bucketName/testUploadImage.png") else { throw someError } let headers = try s3Signer.authHeadersV4(httpMethod: .put, urlString: url.absoluteString, headers: [:], payload: .bytes(bytesObject)) var request = URLRequest(url: url) request.httpMethod = HTTPMethod.put.rawValue request.httpBody = Data(bytes: bytesObject) headers.forEach { request.setValue($0.key, forHTTPHeaderField: $0.value) } // make network request } catch { //handle error } } ``` DELETE
do {
guard let url = URL(string: "https://s3.amazonaws.com/bucketName/testUploadImage.png") else { throw someError }
let headers = try s3Signer.authHeadersV4(httpMethod: .delete, urlString: url.absoluteString, headers: [:], payload: .none)
var request = URLRequest(url: url)
request.httpMethod = HTTPMethod.delete.rawValue
headers.forEach { request.setValue($0.key, forHTTPHeaderField: $0.value) }
// make network request
} catch {
//handle error
}
}V4 Pre-Signed URL
Similar to the ease of generating authentication headers, to generate a pre-signed url:
let presignedURL = signer.presignedURLV4(httpMethod: HTTPMethod, urlString: String, expiration: TimeFromNow, headers: [String: String]) -> String
```Package Metadata
Repository: justinm1/s3signeraws
Default branch: master
README: README.md