# Invalid Parameter - signature length error, 0 \< length \< 150

**URL:** <https://devforum.zoom.us/t/invalid-parameter-signature-length-error-0-length-150/36563>\
**Category:** Web\
**Created:** [November 20, 2020, 3:53pm UTC](https://devforum.zoom.us/t/invalid-parameter-signature-length-error-0-length-150/36563 "2020-11-20T15:53:29Z")\
**Posts on this page:** 14\
**Page:** 1

<div class="post-metadata">

**Author:** ![john8](https://avatars.discourse-cdn.com/v4/letter/j/43a26b/32.png) [@john8](https://devforum.zoom.us/u/john8)\
**Post date:** [November 20, 2020, 3:53pm UTC](https://devforum.zoom.us/t/invalid-parameter-signature-length-error-0-length-150/36563/1 "2020-11-20T15:53:29Z")

</div>

Hi Everyone,

I am trying to create a zoom meeting and then join it as host. I generate the toke and then create the meeting just fine but when I try to join in I get the error above. I am including screenshots showing the meeting being created and the error I am receiving when trying to join it.

Any help is appreciated.

 ![Zoom2](https://us1.discourse-cdn.com/flex016/uploads/zoomdeveloper/original/3X/e/2/e26d16af3a821e0bb5db47f7c98516bea27ccfdc.png) ![Zoom3](https://us1.discourse-cdn.com/flex016/uploads/zoomdeveloper/original/3X/d/a/da177c9f2b8fe41dd1c93c24f775e01e24cc3e72.png) ![ZoomMtg](https://us1.discourse-cdn.com/flex016/uploads/zoomdeveloper/original/3X/8/1/81b24a7a72b1ee12492631388d4d15113bc92ba0.png)

---

<div class="post-metadata">

**Author:** ![tommy](https://sea2.discourse-cdn.com/flex016/user_avatar/devforum.zoom.us/tommy/32/72769_2.png) [@tommy](https://devforum.zoom.us/u/tommy)\
**Post date:** [November 23, 2020, 10:17pm UTC](https://devforum.zoom.us/t/invalid-parameter-signature-length-error-0-length-150/36563/2 "2020-11-23T22:17:22Z")

</div>

Hey @john8,

Happy to help! 🙂 Can you please share your [Web SDK signature](https://marketplace.zoom.us/docs/sdk/native-sdks/web/build/signature) for a test meeting to [developersupport@zoom.us](mailto:developersupport@zoom.us), so I can debug it?

Thanks,  
Tommy

---

<div class="post-metadata">

**Author:** ![john8](https://avatars.discourse-cdn.com/v4/letter/j/43a26b/32.png) [@john8](https://devforum.zoom.us/u/john8)\
**Post date:** [November 25, 2020, 4:47pm UTC](https://devforum.zoom.us/t/invalid-parameter-signature-length-error-0-length-150/36563/3 "2020-11-25T16:47:46Z")

</div>

Hi Tommy,

The signature is in both of the images above. Let me know if you need anything else.

Thanks

---

<div class="post-metadata">

**Author:** ![john8](https://avatars.discourse-cdn.com/v4/letter/j/43a26b/32.png) [@john8](https://devforum.zoom.us/u/john8)\
**Post date:** [November 30, 2020, 6:50pm UTC](https://devforum.zoom.us/t/invalid-parameter-signature-length-error-0-length-150/36563/4 "2020-11-30T18:50:52Z")

</div>

Hi Tommy,

Here is the error I am receiving

Any help is appreciated.

Thanks

John

---

<div class="post-metadata">

**Author:** ![tommy](https://sea2.discourse-cdn.com/flex016/user_avatar/devforum.zoom.us/tommy/32/72769_2.png) [@tommy](https://devforum.zoom.us/u/tommy)\
**Post date:** [December 1, 2020, 9:18pm UTC](https://devforum.zoom.us/t/invalid-parameter-signature-length-error-0-length-150/36563/5 "2020-12-01T21:18:59Z")

</div>

Hey @john8,

After [base64 decoding](https://www.base64decode.org/) your signature it looks like you are generating it incorrectly:

 ![Screen Shot 2020-12-01 at 2.17.44 PM](https://us1.discourse-cdn.com/flex016/uploads/zoomdeveloper/original/3X/b/d/bd32ff4d9d5f32414e02788a22ed3fbc674b855c.jpeg)

Decoded, it should be in the following format:

`jwtKey.meetingNumber.expiryTime.role.encryptedJwtSecret`

> **[Generate Signature - Build an App - Web - Client SDKs - Zoom Software...](https://marketplace.zoom.us/docs/sdk/native-sdks/web/build/signature)**
>
> Generate Signature
> 
> Each request to start or join a meeting / webinar must be verified by an encrypted signature authorizing each user to enter. A signa...

Thanks,  
Tommy

---

<div class="post-metadata">

**Author:** ![sdk\_testing](https://avatars.discourse-cdn.com/v4/letter/s/90db22/32.png) [@sdk\_testing](https://devforum.zoom.us/u/sdk_testing)\
**Post date:** [December 9, 2020, 4:52pm UTC](https://devforum.zoom.us/t/invalid-parameter-signature-length-error-0-length-150/36563/6 "2020-12-09T16:52:26Z")

</div>

Hi

I have exactly the same issue, I think I am generating the signature wrong. Could you have a look at the code and potentially help me find the issue?

```
const timestamp = new Date().getTime() - 30000
const msg = Base64.encode(config.apiKey + config.meetingNumber + timestamp + config.role)
const hash = Base64.encode(CryptoJS.HmacSHA256(msg, API_SECRET).toString(CryptoJS.enc.Hex))
const signature = Base64.encode(`${config.apiKey}.${config.meetingNumber}.${timestamp}.${config.role}.${hash}`)
```

---

<div class="post-metadata">

**Author:** ![john8](https://avatars.discourse-cdn.com/v4/letter/j/43a26b/32.png) [@john8](https://devforum.zoom.us/u/john8)\
**Post date:** [December 9, 2020, 6:12pm UTC](https://devforum.zoom.us/t/invalid-parameter-signature-length-error-0-length-150/36563/7 "2020-12-09T18:12:04Z")

</div>

Hi, I just got this working then I was called off to do something else so the code may be a little sloppy but here are rough steps to get a token, then create, start and join a meeting. This is in [ASP.NET](http://ASP.NET) MVC with C# and jQuery.

First, generate a token

static readonly char padding = { ‘=’ };

public static string GenerateToken(string apiKey, string apiSecret, string meetingNumber, string ts, string role)

{

string message = String.Format("{0}{1}{2}{3}", apiKey, meetingNumber, ts, role);

apiSecret = apiSecret ?? “”;

var encoding = new System.Text.ASCIIEncoding();

byte keyByte = encoding.GetBytes(apiSecret);

byte messageBytesTest = encoding.GetBytes(message);

string msgHashPreHmac = System.Convert.ToBase64String(messageBytesTest);

byte messageBytes = encoding.GetBytes(msgHashPreHmac);

using (var hmacsha256 = new HMACSHA256(keyByte))

{

byte hashmessage = hmacsha256.ComputeHash(messageBytes);

string msgHash = System.Convert.ToBase64String(hashmessage);

string token = String.Format("{0}.{1}.{2}.{3}.{4}", apiKey, meetingNumber, ts, role, msgHash);

var tokenBytes = System.Text.Encoding.UTF8.GetBytes(token);

return System.Convert.ToBase64String(tokenBytes).TrimEnd(padding);

}

}

Next, create a meeting. This is fetched in a .js file. The token passed in is the token created above. From the json, you can parse out the Meeting ID (id) and Meeting Password (password) for the new meeting and store it in the fields MeetingNumber and Password on the page.

public async Task CreateMeetingAsync(string token)

{

var stringContent = “{“topic”: “Test Meeting”,“type”: “1”,“timezone”: “America/Chicago”,“password”: “password”,“agenda”: “Test Agenda”,” +

““settings”: {“host\_video”: “true”,“participant\_video”: “false”,“cn\_meeting”: “false”,“in\_meeting”: “false”,“join\_before\_host”: “false”,” +

““mute\_upon\_entry”: “false”,“watermark”: “false”,“use\_pmi”: “false”,“approval\_type”: “0”,“registration\_type”: “1”,“audio”: “both”,“auto\_recording”: “none”}}”;

HttpClient client = new HttpClient();

client.BaseAddress = new Uri(“[https://api.zoom.us/v2/users/yourZoom@emailAddress.com/meetings](https://api.zoom.us/v2/users/yourZoom@emailAddress.com/meetings)”);

client.DefaultRequestHeaders

.Accept

.Add(new MediaTypeWithQualityHeaderValue(“application/json”));//ACCEPT header

client.DefaultRequestHeaders.Add(“Authorization”, "Bearer " + token);

HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, “meetings”);

request.Content = new StringContent(stringContent,

Encoding.UTF8,

“application/json”);//CONTENT-TYPE header

HttpResponseMessage response = new HttpResponseMessage();

await client.SendAsync(request)

.ContinueWith(responseTask =\>

{

Console.WriteLine(“Response: {0}”, responseTask.Result);

response = responseTask.Result;

});

var json = response.Content.ReadAsStringAsync();

return Json(json);

}

Then you will need to generate an access token for the meeting id you just received. Again, this is fetched in the .js file. I store this in a field called MeetingToken on the page.

public ActionResult GetMeetingAccessToken(string meetingNumber)

{

String ts = (ToTimestamp(DateTime.UtcNow.ToUniversalTime()) - 30000).ToString();

string role = “1”;

var result = GenerateToken(apiKey, apiSecret, meetingNumber, ts, role);

return Json(result);

}

Now you should have all the info you need to join the meeting via ZoomMtg. Below is a snippet of code from the .js file, $(‘#Role’) is 1

function joinMeeting() {

meetConfig.apiKey = API\_KEY;

meetConfig.signature = $(’#MeetingToken’).val();

meetConfig.userName = $(’#Name’).val();

meetConfig.passWord = $(’#Password’).val();

meetConfig.role = $(’#Role’).val();

meetConfig.meetingNumber = $(’#MeetingNumber’).val();

ZoomMtg.init({

leaveUrl: meetConfig.leaveUrl,

isSupportAV: true,

debug: true,

success: function (res) {

ZoomMtg.join({

signature: meetConfig.signature,

apiKey: meetConfig.apiKey,

meetingNumber: meetConfig.meetingNumber,

userEmail: meetConfig.userEmail,

userName: meetConfig.userName,

passWord: meetConfig.passWord,

success: function (res) {

console.log(‘success’);

},

error: function (res) {

console.log(‘error’);

console.log(res);

},

})

},

error: function (error) {

console.log(‘error’);

}

});

ZoomMtg.inMeetingServiceListener(‘onUserJoin’, function (data) {

console.log(‘inMeetingServiceListener onUserJoin’, data);

});

ZoomMtg.inMeetingServiceListener(‘onUserLeave’, function (data) {

console.log(‘inMeetingServiceListener onUserLeave’, data);

});

ZoomMtg.inMeetingServiceListener(‘onUserIsInWaitingRoom’, function (data) {

console.log(‘inMeetingServiceListener onUserIsInWaitingRoom’, data);

});

ZoomMtg.inMeetingServiceListener(‘onMeetingStatus’, function (data) {

// {status: 1(connecting), 2(connected), 3(disconnected), 4(reconnecting)}

console.log(‘inMeetingServiceListener onMeetingStatus’, data);

});

}

Hope this helps!

---

<div class="post-metadata">

**Author:** ![sdk\_testing](https://avatars.discourse-cdn.com/v4/letter/s/90db22/32.png) [@sdk\_testing](https://devforum.zoom.us/u/sdk_testing)\
**Post date:** [December 10, 2020, 8:58am UTC](https://devforum.zoom.us/t/invalid-parameter-signature-length-error-0-length-150/36563/8 "2020-12-10T08:58:54Z")

</div>

Thanks a lot. I just got it working by simply using the method already available in the API:

```
ZoomMtg.generateSignature(...)
```

---

<div class="post-metadata">

**Author:** ![MaxM](https://sea2.discourse-cdn.com/flex016/user_avatar/devforum.zoom.us/maxm/32/42303_2.png) [@MaxM](https://devforum.zoom.us/u/MaxM)\
**Post date:** [December 10, 2020, 11:05pm UTC](https://devforum.zoom.us/t/invalid-parameter-signature-length-error-0-length-150/36563/9 "2020-12-10T23:05:30Z")

</div>

Hey @sdk_testing,

I’m glad to hear that @john8’s post was helpful and that you were able to get it figured out. As always, feel free to reach out if you encounter any further issues or questions.

Thanks,  
Max

---

<div class="post-metadata">

**Author:** ![qwakuaa](https://sea2.discourse-cdn.com/flex016/user_avatar/devforum.zoom.us/qwakuaa/32/21104_2.png) [@qwakuaa](https://devforum.zoom.us/u/qwakuaa)\
**Post date:** [January 7, 2021, 10:34am UTC](https://devforum.zoom.us/t/invalid-parameter-signature-length-error-0-length-150/36563/10 "2021-01-07T10:34:01Z")

</div>

hi… i used the sample code in PHP from zoom link [https://marketplace.zoom.us/docs/sdk/native-sdks/web/build/signature](https://marketplace.zoom.us/docs/sdk/native-sdks/web/build/signature) to generate signature but gives me error message that " signatrue length error, 0 \< length \< 150" …

i tried this formula `jwtKey.meetingNumber.expiryTime.role.encryptedJwtSecret`  
by doing this  
**$\_sig = $api\_key . “.” . $meeting\_number . “.” . $time . “.” . $role . “.” . api\_secret;\*\* \*\*return rtrim(strtr(base64\_encode(_sig), ‘+/’, '-_’), ‘=’);**  
but i still get the same error  
any help?

---

<div class="post-metadata">

**Author:** ![john8](https://avatars.discourse-cdn.com/v4/letter/j/43a26b/32.png) [@john8](https://devforum.zoom.us/u/john8)\
**Post date:** [January 7, 2021, 8:16pm UTC](https://devforum.zoom.us/t/invalid-parameter-signature-length-error-0-length-150/36563/11 "2021-01-07T20:16:36Z")

</div>

Hi qwakuaa,

Did you use the following to generate your signature?

```auto
function generate_signature ( $api_key, $api_secret, $meeting_number, $role){

	$time = time() * 1000 - 30000;//time in milliseconds (or close enough)
	
	$data = base64_encode($api_key . $meeting_number . $time . $role);
	
	$hash = hash_hmac('sha256', $data, $api_secret, true);
	
	$_sig = $api_key . "." . $meeting_number . "." . $time . "." . $role . "." . base64_encode($hash);
	
	//return signature, url safe base64 encoded
	return rtrim(strtr(base64_encode($_sig), '+/', '-_'), '=');
}

You can test if it is correct by decoding it here https://www.base64decode.org/

Thanks

```

---

<div class="post-metadata">

**Author:** ![qwakuaa](https://sea2.discourse-cdn.com/flex016/user_avatar/devforum.zoom.us/qwakuaa/32/21104_2.png) [@qwakuaa](https://devforum.zoom.us/u/qwakuaa)\
**Post date:** [January 8, 2021, 11:49am UTC](https://devforum.zoom.us/t/invalid-parameter-signature-length-error-0-length-150/36563/12 "2021-01-08T11:49:35Z")

</div>

working now… i changed return to echo

---

<div class="post-metadata">

**Author:** ![tommy](https://sea2.discourse-cdn.com/flex016/user_avatar/devforum.zoom.us/tommy/32/72769_2.png) [@tommy](https://devforum.zoom.us/u/tommy)\
**Post date:** [January 11, 2021, 10:10pm UTC](https://devforum.zoom.us/t/invalid-parameter-signature-length-error-0-length-150/36563/13 "2021-01-11T22:10:35Z")

</div>

Happy to hear you got it working @qwakuaa ! 🙂

Thanks for your suggestion @john8 !

Thanks,  
Tommy

---

<div class="post-metadata">

**Author:** ![system](https://us1.discourse-cdn.com/flex016/uploads/zoomdeveloper/original/3X/6/1/614bdd549b610bbaa46ff934617683a02bdaa03c.png) [@system](https://devforum.zoom.us/u/system)\
**Post date:** [February 11, 2021, 8:10am UTC](https://devforum.zoom.us/t/invalid-parameter-signature-length-error-0-length-150/36563/14 "2021-02-11T08:10:41Z")

</div>

Closed on February 11, 2021, 8:10am UTC

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.
