Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/JustinM1/S3SignerAWS

Pure Swift AWS S3 Signer, generates V4 Auth Headers and V4 presignedURLs
https://github.com/JustinM1/S3SignerAWS

Last synced: 2 months ago
JSON representation

Pure Swift AWS S3 Signer, generates V4 Auth Headers and V4 presignedURLs

Awesome Lists containing this project

README

        

# S3SignerAWS

[![codecov](https://codecov.io/gh/JustinM1/S3SignerAWS/branch/master/graph/badge.svg)](https://codecov.io/gh/JustinM1/S3SignerAWS)
[![Build Status](https://app.bitrise.io/app/cf5b884ca2181b4c/status.svg?token=QM_jU5_3BEQRmt0OmdVwJw&branch=master)](https://app.bitrise.io/app/cf5b884ca2181b4c)
[![CircleCI](https://circleci.com/gh/JustinM1/S3SignerAWS.svg?style=svg)](https://circleci.com/gh/JustinM1/S3SignerAWS)
[![Codacy Badge](https://api.codacy.com/project/badge/Grade/2a752fec330b42299f4425448cfee76e)](https://www.codacy.com/app/JustinM1/S3SignerAWS?utm_source=github.com&utm_medium=referral&utm_content=JustinM1/S3SignerAWS&utm_campaign=Badge_Grade)
Swift 5.0

Generates V4 authorization headers and pre-signed URLs for authenticating AWS S3 REST API calls

Check out [VaporS3Signer](https://github.com/JustinM1/VaporS3Signer.git) if your using `Vapor`.

### Features
- [x] Pure Swift
- [x] All required headers generated automatically
- [x] V4 Authorization header
- [x] V4 pre-signed URL
- [x] Support DELETE/GET/HEAD/PUT/POST
- [x] Single chunk uploads
- [ ] Multiple chunk uploads

## Table of Contents
- [Integration](#integration)
- [Usage](#usage)
- [V4 Authorization Header](#v4-authorization-header)
- [V4 Pre-Signed URL](#v4-pre-signed-url)

## Integration
**Swift Package Manager**

To install with swift package manager, add the package to your `Package.swift` file:
```ruby
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.
* `Payload` enum:

```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:

```ruby
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

```ruby
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

```ruby
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

```ruby
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:
```ruby
let presignedURL = signer.presignedURLV4(httpMethod: HTTPMethod, urlString: String, expiration: TimeFromNow, headers: [String: String]) -> String
```