base.js

  1. /**
  2. * Generate signature for ZoomMtg WebSDK. {@link https://github.com/danharper/hmac-examples|hmac-examples}
  3. * @param string $api_key You REST API Key
  4. * @param string $api_secret You REST API Secret
  5. * @param int $meeting_number The meeting number you are creating the signature for
  6. * @param int $role Role that this signature is for; 0 for participant, 1 for host
  7. * @return {string} Returns the signature string
  8. * @method generate_signature
  9. * @example
  10. //======================================================================================================
  11. //PHP example code
  12. function generate_signature ( $api_key, $api_sercet, $meeting_number, $role){
  13. $time = time() * 1000 - 30000; //time in milliseconds (or close enough)
  14. $data = base64_encode($api_key . $meeting_number . $time . $role);
  15. $hash = hash_hmac('sha256', $data, $api_sercet, true);
  16. $_sig = $api_key . "." . $meeting_number . "." . $time . "." . $role . "." . base64_encode($hash);
  17. //return signature, url safe base64 encoded
  18. return rtrim(strtr(base64_encode($_sig), '+/', '-_'), '=');
  19. }
  20. //======================================================================================================
  21. //Java example code
  22. import javax.crypto.Mac;
  23. import javax.crypto.spec.SecretKeySpec;
  24. import java.security.NoSuchAlgorithmException;
  25. import java.util.Base64;
  26. import java.security.InvalidKeyException;
  27. import javax.xml.bind.DatatypeConverter;
  28. public class test {
  29. public static String generateSignature(String apiKey, String apiSecret, String meetingNumber, Integer role) {
  30. try {
  31. Mac hasher = Mac.getInstance("HmacSHA256");
  32. String ts = Long.toString(System.currentTimeMillis() - 30000);
  33. String msg = String.format("%s%s%s%d", apiKey, meetingNumber, ts, role);
  34. hasher.init(new SecretKeySpec(apiSecret.getBytes(), "HmacSHA256"));
  35. String message = Base64.getEncoder().encodeToString(msg.getBytes());
  36. byte[] hash = hasher.doFinal(message.getBytes());
  37. String hashBase64Str = DatatypeConverter.printBase64Binary(hash);
  38. String tmpString = String.format("%s.%s.%s.%d.%s", apiKey, meetingNumber, ts, role, hashBase64Str);
  39. String encodedString = Base64.getEncoder().encodeToString(tmpString.getBytes());
  40. return encodedString.replaceAll("\\=+$", "");
  41. }
  42. catch (NoSuchAlgorithmException e) {}
  43. catch (InvalidKeyException e) {}
  44. return "";
  45. }
  46. public static void main(String[] args) {
  47. String signature = test.generateSignature("apiKey", "apiSecret", "meetingNumber", 0);
  48. System.out.println(signature);
  49. }
  50. }
  51. //======================================================================================================
  52. //Python2 example code
  53. import hashlib
  54. import hmac
  55. import base64
  56. import time
  57. def generateSignature(data):
  58. ts = (int(round(time.time() * 1000)) - 30000); #ts; // 1544683367752
  59. print (ts)
  60. msg = data['apiKey'] + str(data['meetingNumber']) + str(ts) + str(data['role']);
  61. message = base64.b64encode(bytes(msg).encode('utf-8'));
  62. secret = bytes(data['apiSecret']).encode('utf-8')
  63. hash = hmac.new(secret, message, hashlib.sha256);
  64. hash = base64.b64encode(hash.digest());
  65. hash = hash.decode("utf-8");
  66. tmpString = "%s.%s.%s.%s.%s" % (data['apiKey'], str(data['meetingNumber']), str(ts), str(data['role']), hash);
  67. signature = base64.b64encode(bytes(tmpString).encode("utf-8"));
  68. signature = signature.decode("utf-8");
  69. return signature.rstrip("=");
  70. if __name__ == '__main__':
  71. data = {'apiKey': "" ,
  72. 'apiSecret': "",
  73. 'meetingNumber': 8998,
  74. 'role': 0}
  75. print (generateSignature(data))
  76. //======================================================================================================
  77. //Python3 example code
  78. import hashlib
  79. import hmac
  80. import base64
  81. import datetime
  82. def generateSignature(data):
  83. ts = int(round(datetime.datetime.utcnow().timestamp() * 1000)) - 30000;
  84. msg = data['apiKey'] + str(data['meetingNumber']) + str(ts) + str(data['role']);
  85. message = base64.b64encode(bytes(msg, 'utf-8'));
  86. # message = message.decode("utf-8");
  87. secret = bytes(data['apiSecret'], 'utf-8')
  88. hash = hmac.new(secret, message, hashlib.sha256);
  89. hash = base64.b64encode(hash.digest());
  90. hash = hash.decode("utf-8");
  91. tmpString = "%s.%s.%s.%s.%s" % (data['apiKey'], str(data['meetingNumber']), str(ts), str(data['role']), hash);
  92. signature = base64.b64encode(bytes(tmpString, "utf-8"));
  93. signature = signature.decode("utf-8");
  94. return signature.rstrip("=");
  95. if __name__ == '__main__':
  96. data = {'apiKey': "" ,
  97. 'apiSecret': "",
  98. 'meetingNumber': 888,
  99. 'role': 0}
  100. print (generateSignature(data))
  101. //======================================================================================================
  102. //Nodejs
  103. // npm install --save-dev js-base64 crypto-js
  104. const base64JS = require('js-base64');
  105. const hmacSha256 = require('crypto-js/hmac-sha256');
  106. const encBase64 = require('crypto-js/enc-base64');
  107. function generateSignature(data) {
  108. let signature = '';
  109. // Prevent time sync issue between client signature generation and zoom
  110. const ts = new Date().getTime() - 30000;
  111. const msg = base64JS.Base64.encode(data.apiKey + data.meetingNumber + ts + data.role);
  112. const hash = hmacSha256(msg, data.apiSecret);
  113. signature = base64JS.Base64.encodeURI(`${data.apiKey}.${data.meetingNumber}.${ts}.${data.role}.${encBase64.stringify(hash)}`);
  114. return signature;
  115. }
  116. const data = {apiKey: "" ,
  117. apiSecret: "",
  118. meetingNumber: 888,
  119. role: 0}
  120. console.log(generateSignature(data));
  121. //======================================================================================================
  122. // WebSDK us this generateSignature
  123. // npm install --save-dev js-base64 crypto-js
  124. import * as base64JS from 'js-base64';
  125. import * as hmacSha256 from 'crypto-js/hmac-sha256';
  126. import * as encBase64 from 'crypto-js/enc-base64';
  127. function generateSignature(data) {
  128. let signature = '';
  129. const ts = new Date().getTime() - 30000;
  130. try {
  131. const msg = base64JS.Base64.encode(data.apiKey + data.meetingNumber + ts + data.role);
  132. const hash = hmacSha256.default(msg, data.apiSecret);
  133. signature = base64JS.Base64.encodeURI(`${data.apiKey}.${data.meetingNumber}.${ts}.${data.role}.${encBase64.stringify(hash)}`);
  134. } catch (e) {
  135. console.log('error');
  136. }
  137. return signature;
  138. }
  139. *
  140. //======================================================================================================
  141. // C#
  142. // this demo use vscode and .NET Core 2.2.5
  143. // https://docs.microsoft.com/en-us/dotnet/core/tutorials/with-visual-studio-code
  144. // https://dotnet.microsoft.com/download
  145. // https://www.red-gate.com/simple-talk/dotnet/net-development/jwt-authentication-microservices-net/
  146. // https://www.jokecamp.com/blog/examples-of-creating-base64-hashes-using-hmac-sha256-in-different-languages/#csharp
  147. // https://marketplace.zoom.us/docs/sdk/native-sdks/Web-Client-SDK/tutorial/generate-signature
  148. using System;
  149. using System.Security.Cryptography;
  150. using System.Text;
  151. namespace Zoom {
  152. class Program {
  153. static readonly char[] padding = { '=' };
  154. static void Main (string[] args) {
  155. Console.WriteLine ("Zoom copyright!");
  156. Console.WriteLine ("generate websdk token!");
  157. string apiKey = "apiKey";
  158. string apiSecret = "apiSecret";
  159. string meetingNumber = "";
  160. String ts = (ToTimestamp(DateTime.UtcNow.ToUniversalTime()) - 30000).ToString();
  161. string role = "1";
  162. string token = GenerateToken (apiKey, apiSecret, meetingNumber, ts, role);
  163. Console.WriteLine (token);
  164. }
  165. public static long ToTimestamp (DateTime value) {
  166. long epoch = (value.Ticks - 621355968000000000) / 10000;
  167. return epoch;
  168. }
  169. public static string GenerateToken (string apiKey, string apiSecret, string meetingNumber, string ts, string role) {
  170. string message = String.Format ("{0}{1}{2}{3}", apiKey, meetingNumber, ts, role);
  171. apiSecret = apiSecret ?? "";
  172. // Console.WriteLine ("message: " + message + " secret: " + apiSecret);
  173. var encoding = new System.Text.ASCIIEncoding ();
  174. byte[] keyByte = encoding.GetBytes (apiSecret);
  175. byte[] messageBytes = encoding.GetBytes (message);
  176. // Console.WriteLine (System.Convert.ToBase64String (messageBytes));
  177. using (var hmacsha256 = new HMACSHA256 (keyByte)) {
  178. byte[] key1 = Encoding.ASCII.GetBytes (apiSecret);
  179. byte[] hashmessage = hmacsha256.ComputeHash (messageBytes);
  180. string msgHash = System.Convert.ToBase64String (hashmessage);
  181. // Console.WriteLine ("msgHash: " + msgHash);
  182. string token = String.Format ("{0}.{1}.{2}.{3}.{4}", apiKey, meetingNumber, ts, role, msgHash);
  183. // Console.WriteLine("token", token, " ", Base64Encode(token));
  184. var tokenBytes = System.Text.Encoding.UTF8.GetBytes (token);
  185. return System.Convert.ToBase64String (tokenBytes).TrimEnd(padding);
  186. }
  187. }
  188. }
  189. }
  190. */