From cc28bae378de41f7ecaeba00f2879a9b7c985ba2 Mon Sep 17 00:00:00 2001 From: hawaiyon Date: Mon, 16 Oct 2023 14:49:25 +0800 Subject: [PATCH] feat: add rest api checksum demo code --- server/token_server/cpp/src/rest_api_auth.h | 24 ++++++++++++++ .../token_server/cpp/test/rest_api_auth.cpp | 24 ++++++++++++++ .../TokenBuilder.Test/RestApiAuthTests.cs | 20 +++++++++++ .../dotnet/TokenBuilder/RestApiAuth.cs | 27 +++++++++++++++ .../token_server/go/token/restful_api_auth.go | 11 +++++++ .../go/token/restful_api_auth_test.go | 12 +++++++ .../com/netease/im/rtctoken/RestApiAuth.java | 24 ++++++++++++++ .../netease/im/rtctoken/RestApiAuthTest.java | 12 +++++++ server/token_server/nodejs/src/RestApiAuth.js | 15 +++++++++ .../nodejs/test/RestAPIAuthTest.js | 12 +++++++ server/token_server/php/src/RestApiAuth.php | 5 +++ .../token_server/php/test/RestApiAuthTest.php | 33 +++++++++++++++++++ .../token_server/python3/src/rest_api_auth.py | 5 +++ .../python3/test/test_get_checksum.py | 13 ++++++++ 14 files changed, 237 insertions(+) create mode 100644 server/token_server/cpp/src/rest_api_auth.h create mode 100644 server/token_server/cpp/test/rest_api_auth.cpp create mode 100644 server/token_server/dotnet/TokenBuilder.Test/RestApiAuthTests.cs create mode 100644 server/token_server/dotnet/TokenBuilder/RestApiAuth.cs create mode 100644 server/token_server/go/token/restful_api_auth.go create mode 100644 server/token_server/go/token/restful_api_auth_test.go create mode 100644 server/token_server/java/src/main/java/com/netease/im/rtctoken/RestApiAuth.java create mode 100644 server/token_server/java/src/test/java/com/netease/im/rtctoken/RestApiAuthTest.java create mode 100644 server/token_server/nodejs/src/RestApiAuth.js create mode 100644 server/token_server/nodejs/test/RestAPIAuthTest.js create mode 100644 server/token_server/php/src/RestApiAuth.php create mode 100644 server/token_server/php/test/RestApiAuthTest.php create mode 100644 server/token_server/python3/src/rest_api_auth.py create mode 100644 server/token_server/python3/test/test_get_checksum.py diff --git a/server/token_server/cpp/src/rest_api_auth.h b/server/token_server/cpp/src/rest_api_auth.h new file mode 100644 index 0000000..44c0b6c --- /dev/null +++ b/server/token_server/cpp/src/rest_api_auth.h @@ -0,0 +1,24 @@ +#include +#include +#include +#include +#include + + +std::string sha1(const std::string &input) +{ + unsigned char hash[SHA_DIGEST_LENGTH]; + SHA1(reinterpret_cast(input.c_str()), input.length(), hash); + std::ostringstream oss; + oss << std::hex << std::setfill('0'); + for (auto c : hash) + { + oss << std::setw(2) << static_cast(c); + } + return oss.str(); +} + +std::string getChecksum(const std::string appSecret, std::string nonce, long curtime) +{ + return sha1(appSecret + nonce + std::to_string(curtime)); +} diff --git a/server/token_server/cpp/test/rest_api_auth.cpp b/server/token_server/cpp/test/rest_api_auth.cpp new file mode 100644 index 0000000..828a98c --- /dev/null +++ b/server/token_server/cpp/test/rest_api_auth.cpp @@ -0,0 +1,24 @@ +#include "../src/rest_api_auth.h" +#include +#include +#include + +class RestApiAuth_test : public testing::Test +{ +protected: + virtual void SetUp() override {} + + virtual void TearDown() {} + + void TestGetChecksum() + { + std::string token = getChecksum("c00000000000", "1234567890", 1697168455); + std::cout << "checksum: " << token << std::endl; + EXPECT_EQ(token, "192bdbdad337836e6213aec1d93186aae9771c39"); + } +}; + +TEST_F(RestApiAuth_test, RestApiAuth_test) +{ + TestGetChecksum(); +} diff --git a/server/token_server/dotnet/TokenBuilder.Test/RestApiAuthTests.cs b/server/token_server/dotnet/TokenBuilder.Test/RestApiAuthTests.cs new file mode 100644 index 0000000..c77158d --- /dev/null +++ b/server/token_server/dotnet/TokenBuilder.Test/RestApiAuthTests.cs @@ -0,0 +1,20 @@ +using Microsoft.VisualStudio.TestTools.UnitTesting; +using TokenBuilder; +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace TokenBuilder.Tests +{ + [TestClass()] + public class RestApiAuthTests + { + [TestMethod()] + public void GetChecksumTest() + { + Assert.AreEqual("192bdbdad337836e6213aec1d93186aae9771c39", RestApiAuth.GetChecksum("c00000000000", "1234567890", 1697168455)); + } + } +} \ No newline at end of file diff --git a/server/token_server/dotnet/TokenBuilder/RestApiAuth.cs b/server/token_server/dotnet/TokenBuilder/RestApiAuth.cs new file mode 100644 index 0000000..4b2a3f3 --- /dev/null +++ b/server/token_server/dotnet/TokenBuilder/RestApiAuth.cs @@ -0,0 +1,27 @@ +using System.Security.Cryptography; +using System.Text; + +namespace TokenBuilder +{ + public class RestApiAuth + { + public static string GetChecksum(string appSecret, string nonce, long curtime) + { + return ComputeSHA1($"{appSecret}{nonce}{curtime}"); + } + private static string ComputeSHA1(string input) + { + using var sha1 = SHA1.Create(); + var hash = sha1.ComputeHash(Encoding.UTF8.GetBytes(input)); + var sb = new StringBuilder(hash.Length * 2); + + foreach (byte b in hash) + { + sb.Append(b.ToString("x2")); + } + + return sb.ToString(); + } + } +} + diff --git a/server/token_server/go/token/restful_api_auth.go b/server/token_server/go/token/restful_api_auth.go new file mode 100644 index 0000000..287e002 --- /dev/null +++ b/server/token_server/go/token/restful_api_auth.go @@ -0,0 +1,11 @@ +package token + +import ( + "crypto/sha1" + "fmt" +) + +func GetChecksum(appSecret, nonce string, curtime int64) string { + raw := fmt.Sprintf("%s%s%d", appSecret, nonce, curtime) + return fmt.Sprintf("%x", sha1.Sum([]byte(raw))) +} diff --git a/server/token_server/go/token/restful_api_auth_test.go b/server/token_server/go/token/restful_api_auth_test.go new file mode 100644 index 0000000..007c7ab --- /dev/null +++ b/server/token_server/go/token/restful_api_auth_test.go @@ -0,0 +1,12 @@ +package token + +import ( + "testing" + + "github.com/stretchr/testify/assert" +) + +func TestSecureChecksum(t *testing.T) { + assert.Equal(t, "192bdbdad337836e6213aec1d93186aae9771c39", + GetChecksum("c00000000000", "1234567890", 1697168455)) +} diff --git a/server/token_server/java/src/main/java/com/netease/im/rtctoken/RestApiAuth.java b/server/token_server/java/src/main/java/com/netease/im/rtctoken/RestApiAuth.java new file mode 100644 index 0000000..df985f1 --- /dev/null +++ b/server/token_server/java/src/main/java/com/netease/im/rtctoken/RestApiAuth.java @@ -0,0 +1,24 @@ +package com.netease.im.rtctoken; + +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; + +public class RestApiAuth { + public static String getChecksum(String appSecret, String nonce, long curTime) { + return sha1(appSecret + nonce + curTime); + } + private static String sha1(String input) { + try { + MessageDigest mDigest = MessageDigest.getInstance("SHA-1"); + byte[] result = mDigest.digest(input.getBytes(StandardCharsets.UTF_8)); + StringBuilder sb = new StringBuilder(); + for (byte b : result) { + sb.append(String.format("%02x", b)); + } + return sb.toString(); + } catch (Exception e) { + throw new RuntimeException(e); + } + + } +} diff --git a/server/token_server/java/src/test/java/com/netease/im/rtctoken/RestApiAuthTest.java b/server/token_server/java/src/test/java/com/netease/im/rtctoken/RestApiAuthTest.java new file mode 100644 index 0000000..4410d97 --- /dev/null +++ b/server/token_server/java/src/test/java/com/netease/im/rtctoken/RestApiAuthTest.java @@ -0,0 +1,12 @@ +package com.netease.im.rtctoken; + +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +public class RestApiAuthTest { + @Test + public void testChecksum() throws Exception { + assertEquals("192bdbdad337836e6213aec1d93186aae9771c39", RestApiAuth.getChecksum("c00000000000", "1234567890", 1697168455)); + } +} \ No newline at end of file diff --git a/server/token_server/nodejs/src/RestApiAuth.js b/server/token_server/nodejs/src/RestApiAuth.js new file mode 100644 index 0000000..8eacf6b --- /dev/null +++ b/server/token_server/nodejs/src/RestApiAuth.js @@ -0,0 +1,15 @@ +const crypto = require('crypto'); + +var GetChecksum = function (appSecret, nonce, curTime) { + return sha1(`${appSecret}${nonce}${curTime}`); +} + +const sha1 = function (input) { + const sha1 = crypto.createHash('sha1'); + sha1.update(input, 'utf8'); + return sha1.digest('hex'); +} + +module.exports = { + GetChecksum: GetChecksum, +} \ No newline at end of file diff --git a/server/token_server/nodejs/test/RestAPIAuthTest.js b/server/token_server/nodejs/test/RestAPIAuthTest.js new file mode 100644 index 0000000..7283bc2 --- /dev/null +++ b/server/token_server/nodejs/test/RestAPIAuthTest.js @@ -0,0 +1,12 @@ +const test = require('node:test'); +const assert = require('node:assert'); + + +const { GetChecksum } = require('../src/RestApiAuth.js'); + +test('GetChecksum', (t) => { + var appSecret = "c00000000000"; + var nonce = "1234567890"; + var curTime = 1697168455; + assert.equal("192bdbdad337836e6213aec1d93186aae9771c39", GetChecksum(appSecret, nonce, curTime)); +}); \ No newline at end of file diff --git a/server/token_server/php/src/RestApiAuth.php b/server/token_server/php/src/RestApiAuth.php new file mode 100644 index 0000000..4e1e4ee --- /dev/null +++ b/server/token_server/php/src/RestApiAuth.php @@ -0,0 +1,5 @@ + \ No newline at end of file diff --git a/server/token_server/php/test/RestApiAuthTest.php b/server/token_server/php/test/RestApiAuthTest.php new file mode 100644 index 0000000..599986d --- /dev/null +++ b/server/token_server/php/test/RestApiAuthTest.php @@ -0,0 +1,33 @@ +testChecksum(); + } + + public function testChecksum() + { + $this->assertEqual( + "192bdbdad337836e6213aec1d93186aae9771c39", + getChecksum($this->appSecret, "1234567890", 1697168455) + ); + } + + public static function assertEqual($expected, $actual) + { + if ($expected != $actual) { + echo "Assert failed" . "\n Expected :" . $expected . "\n Actual :" . $actual; + } else { + echo "Assert ok\n"; + } + } +} + +$checksumTest = new ChecksumTest(); +$checksumTest->run(); diff --git a/server/token_server/python3/src/rest_api_auth.py b/server/token_server/python3/src/rest_api_auth.py new file mode 100644 index 0000000..b7c9174 --- /dev/null +++ b/server/token_server/python3/src/rest_api_auth.py @@ -0,0 +1,5 @@ +import hashlib + + +def get_checksum(app_secret: str, nonce: str, timestamp: int): + return hashlib.sha1(f'{app_secret}{nonce}{timestamp}'.encode()).hexdigest() diff --git a/server/token_server/python3/test/test_get_checksum.py b/server/token_server/python3/test/test_get_checksum.py new file mode 100644 index 0000000..0accabe --- /dev/null +++ b/server/token_server/python3/test/test_get_checksum.py @@ -0,0 +1,13 @@ +import unittest +from unittest.mock import patch +import sys +import os +import hashlib +sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))) +from src import rest_api_auth + +class TestGetChecksum(unittest.TestCase): + def test_get_checksum(self): + token = rest_api_auth.get_checksum("c00000000000", "1234567890", 1697168455) + expected = "192bdbdad337836e6213aec1d93186aae9771c39" + self.assertEqual(token, expected)