1
0
mirror of https://github.com/imgproxy/imgproxy.git synced 2025-01-03 10:43:58 +02:00

Add Rust example (#614)

This commit is contained in:
Alex Fedoseev 2021-04-26 15:41:02 +03:00 committed by GitHub
parent 97417b3bc6
commit 088ffa80b4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

75
examples/signature.rs Normal file
View File

@ -0,0 +1,75 @@
use std::process;
use base64; // https://crates.io/crates/base64
use hex::{self, FromHexError}; // https://crates.io/crates/hex
use hmac::{Hmac, Mac, NewMac}; // https://crates.io/crates/hmac
use sha2::Sha256; // https://crates.io/crates/sha2
type HmacSha256 = Hmac<Sha256>;
const KEY: &'static str = "943b421c9eb07c830af81030552c86009268de4e532ba2ee2eab8247c6da0881";
const SALT: &'static str = "520f986b998545b4785e0defbc4f3c1203f22de2374a3d53cb7a7fe9fea309c5";
pub struct Image {
pub src: &'static str,
pub width: usize,
pub height: usize,
pub dpr: u8,
pub ext: &'static str,
}
#[derive(Debug)]
pub enum Error {
InvalidKey(FromHexError),
InvalidSalt(FromHexError),
}
fn main() {
let img = Image {
src: "http://img.example.com/pretty/image.jpg",
width: 100,
height: 80,
dpr: 2,
ext: "webp",
};
match sign_url(img) {
Ok(url) => {
println!("{}", url);
process::exit(0);
}
Err(err) => {
eprintln!("{:#?}", err);
process::exit(1);
}
}
}
pub fn sign_url(img: Image) -> Result<String, Error> {
let url = format!(
"/rs:{resize_type}:{width}:{height}:{enlarge}:{extend}/dpr:{dpr}/{src}.{ext}",
resize_type = "auto",
width = img.width,
height = img.height,
enlarge = 0,
extend = 0,
dpr = img.dpr,
src = base64::encode_config(img.src.as_bytes(), base64::URL_SAFE_NO_PAD),
ext = img.ext,
);
let decoded_key = match hex::decode(KEY) {
Ok(key) => key,
Err(err) => return Err(Error::InvalidKey(err)),
};
let decoded_salt = match hex::decode(SALT) {
Ok(salt) => salt,
Err(err) => return Err(Error::InvalidSalt(err)),
};
let mut hmac = HmacSha256::new_varkey(&decoded_key).unwrap();
hmac.update(&decoded_salt);
hmac.update(url.as_bytes());
let signature = hmac.finalize().into_bytes();
let signature = base64::encode_config(signature.as_slice(), base64::URL_SAFE_NO_PAD);
let signed_url = format!("/{signature}{url}", signature = signature, url = url);
Ok(signed_url)
}