I’m currently working on custom Zoom integration (unfortunately, the one provided by n8n works only with Meetings API) to send chat messages to the channel when Airtable record is created.
I was able to create a flow using HTTP requests, however, I need your help to figure out how to most effectively update authorization token.
The thing is that Zoom provides the auth token which expires in 1 hour, and you to make a request to refresh it.
I was thinking of creating a separate workflow which would rely on Cron job and sends refresh requests every 55 minutes or so. However, where can I save the result to be able to access it from a different workflow when needed?
Never dealt with n8n database, and would really appreciate a direction (or documentation with some examples).
Thank you for your help!
If you are using the HTTP node with OAuth2 the token will be refreshed for you. The node handles that behind the scenes.
Also, you can make a feature request here in the community for the missing resources/operations you need.
I looked into it, but the problem with Zoom is that they require Client ID and Client Secret be encoded in base64 format, which doesn’t seem to be supported by default at n8n? Or is it embeded in the code already?
I see what you mean now. If you do the OAuth2 with Zoom, does that work for you (using any available resource/operation)? I wonder if we have a bug in the node, cuz we do not provide that as base64. If it’s working right now, the only thing I can think of it’s that the underlying library manages it.
That’s the case! The current OAuth doesn’t work with zoom, so I just used regular HTTP requests and can get the auth token in that way, but storing and refreshing it is something I have problems with =(
Ok, can you share the endpoint you are trying to use? Also, just had a quick look at the Zoom node and it offers OAuth2 and access token authentication. Why don’t you use access token authentication in the meantime?
Just to clarify, I can use the Zoom Node to handle auth part with an empty action (since the only resource available there is “meeting”) and then send an http request which would use Zoom’s chat API?
Right now my flow looks like this:
- Send an HTTP request to https://zoom.us/oauth/token to get a token
- Send a POST request to https://api.zoom.us/v2/chat/users/XXXXXX/messages using the token from step 1.
As mentioned above, the problem with this workflow is that the token should be updated every hour, but you’re saying if I’ll create an empty Zoom event with oAuth2, it should be able to update automatically in the background?
Yeah, but why don’t you use the access token? so you do not have to worry about the token expiring? Just make sure that when you create the app, make the JWT expiring time something like1 one year.
I’m having this problem too. Zoom is shutting down JWT auth. I need to manually reconnect with zoom when I want my automations to run, or they fail. The built in Zoom node does not support Webinar-related API calls, which are the ones I need, so I am using the HTTP callout node. When I use the Oauth2 API Generic Credential Type, refresh is NOT handled.
Looking at the Zoom docs, I think the n8n node/zoom auth could use the PKCE method: OAuth for user authorized apps
It looks like this would keep the connection open and valid.
I recognize this is an aged out thread, but hoping someone can look at it @RicardoE105 @dennis_maksymov
Were you able to get a workaround in place?
We could update the credential to use PKCE but Zoom supports using OAuth without it which we also support and this will likely not make a difference to your issue.
When using the predefined Zoom OAuth option with the http request node it should be handling the token refresh as needed. Are you using an older version of n8n that doesn’t have the oauth option for zoom?
Hi @Jon, and thanks for taking a look. I’m using 1.16, which should be current. I was using the (zoom) predefined credentials with the http callout node, but that was when I noticed the issue.
The auth fails after 1 hour. I’ve tried to recreate the auth process using chained callout nodes, but the initial code is only accessible once when I click the “Add” button from the zoom marketplace where my app is. I can use that code to generate an access and refresh token, but that doesn’t seem to be useful.
That is unusual I would have expected this to be a bigger issue, I have set up a new Zoom credential and linked it from n8n rather than using the Zoom marketplace option and I have configured it to run every 2 hours to see if I get the same message.
@Jon, Thanks so much for taking a look. I followed the n8n doc to create an app in the market place to fulfill the zoom credentials requirements. The action I want to take is to register webinar attendees, which is not available in the stock zoom node options.
Instead, I set up an HTTP Request node to handle the call and used the zoom credential as a predefined credential type. When that didn’t work I set up a generic credential type OAuth2 API using the zoom app details.
But I still need to reconnect the credentials manually before I want the automation to work if it has been over an hour since I last connected (which sucks).
So for me using the predefined credential it has been running every 2 hours 10:25, 12:25 and 14:25 with no errors so it looks like it does work as expected.
I guess the next step will be to try from an HTTP Request node to see if that makes any difference, When you did the first connect did you do it from in n8n with the connect button or attempt to do it outside of n8n?
Hey @Jon, I set it up from within n8n like this:
I have to use the HTTP Request node to make calls to the API because I need to register webinar attendees. I’ve tried both the predefined credential and the custom OAuth2.
Do you mean by predefined credential that you used the zoom credential in the HTTP Request node?
Here’s the message when it fails:
NodeApiError: The provided authorization grant (e.g., authorization code, resource owner credentials) or refresh token is invalid, expired, revoked, does not match the redirection URI used in the authorization request, or was issued to another client.
at Object.execute (/usr/local/lib/node_modules/n8n/node_modules/n8n-nodes-base/dist/nodes/HttpRequest/V3/HttpRequestV3.node.js:1548:27)
at processTicksAndRejections (node:internal/process/task_queues:95:5)
at Workflow.runNode (/usr/local/lib/node_modules/n8n/node_modules/n8n-workflow/dist/Workflow.js:670:19)
Can you share the workflow you are running? For me this is still working as expected.
Hi @Jon, Here’s the node currently in production: