Sử dụng API key trên với các ngôn ngữ

Với một số ngôn ngữ chưa hỗ trợ cung cấp bộ công cụ SDK, nhà phát triển phần mềm có thể dùng ngôn ngữ bất kỳ để generate ra API key(token) sau đó integrate với Sun S3 thông qua hệ thống Sun S3 Api. Bài viết sau sẽ hướng dẫn generate API key từ accessKey và secretKey. Sau khi có API key, người dùng có thể integrate với S3 bằng http api request.

Java

Setup - Generate API key

private static String generateApiKey(String accessKey, String secretKey, String timeStamp) throws NoSuchAlgorithmException, UnsupportedEncodingException {
    char[] HEX_ARRAY = "0123456789ABCDEF".toCharArray();
    String stringToSign = secretKey + ":" + timeStamp;
    MessageDigest digest = MessageDigest.getInstance("SHA-256");
    byte[] encodedhash = digest.digest(stringToSign.getBytes(StandardCharsets.UTF_8));
    byte[] hexChars = new byte[encodedhash.length * 2];
    for (int j = 0; j < encodedhash.length; j++) {
        int v = encodedhash[j] & 0xFF;
        hexChars[j * 2] = (byte) HEX_ARRAY[v >>> 4];
        hexChars[j * 2 + 1] = (byte) HEX_ARRAY[v & 0x0F];
    }
    String hexString = new String(hexChars);
    String apikey = Base64Utils.encodeToString(String.format("%s:%s:%s", accessKey,
            timeStamp, hexString.toLowerCase()).getBytes(StandardCharsets.UTF_8));
    return apikey;
}

Test Connection

String apikey = generateApiKey("<accessKey>","<secretKey>", "<timestamp>");
String url = "https://client-access.sunteco.vn/s3/v1/bucket?uniqcode=<bucket-code>";
HttpRequest.Builder b = HttpRequest.newBuilder(new URI(url));
b.header("api-key", apikey).GET();
HttpClient httpClient = java.net.http.HttpClient.newHttpClient();
HttpResponse<String> response = httpClient.send(b.build(), HttpResponse.BodyHandlers.ofString());
System.out.println(response.body());

JavaScript / Node.js / ReactJs/ TypeScript

Setup - Generate API key

const generateApiKey = (accessKey, secretKey, timestamp) => {
    const hashedKey = CryptoJS.SHA256(`${secretKey}:${timestamp}`).toString()
    const apikey = btoa(`${accessKey}:${timestamp}:${hashedKey}`, 'base64')
    return apikey
  }

Python

Setup - Generate API key

def generateApiKey(accessKey, secretKey, timeStamp):
  input = secretKey+':'+str(timeStamp)
  sha256endcoded = sha256(input.encode('utf-8')).hexdigest()
  message = accessKey+':'+str(timeStamp) + ':'+ sha256endcoded
  message_bytes = message.encode('utf-8')
  base64_bytes = base64.b64encode(message_bytes)
  api_key = base64_bytes.decode('utf-8')
  return api_key

Csharp

Setup - Generate API key

// Generate api key
static string GenerateApiKey(string accessKey, string secretKey, string timestamp)
{
     var hashedKey = ComputeSha256Hash(accessKey, secretKey, timestamp);
     var preEncodeString = System.Text.Encoding.UTF8.GetBytes(accessKey+":"+timestamp+":"+hashedKey);
     return System.Convert.ToBase64String(preEncodeString);
         
}
// Encrypt timestamp vs secret
static string ComputeSha256Hash(string accessKey, string secretKey, string timestamp) 
{ 
    // Create a SHA256  
    using (SHA256 sha256Hash = SHA256.Create()) 
    { 
        // ComputeHash - returns byte array 
        byte[] bytes = sha256Hash.ComputeHash(Encoding.UTF8.GetBytes(secretKey+":"+timestamp)); 
        // Convert byte array to a string  
        StringBuilder builder = new StringBuilder(); 
        for (int i = 0; i < bytes.Length; i++) 
        { 
            builder.Append(bytes[i].ToString("x2")); 
        } 
        return builder.ToString(); 
    } 
}