401 error on fetch()

I’m trying to import data from an API. I’m able to authenticate via my terminal, but I’m trying to write a script to automate that process (the access token is only good for 24 hours, so they recommend refreshing the authentication before every request or once per day).

As I understand it, fetch() is the way to do an HTTP POST. I’ve written a function to do this, and I keep getting a 401 Unauthorized error. It looks like nothing after the url is getting passed on. I’m sure this is some kind of syntax error on my part, but I’m not familiar enough with JavaScript or API’s to know what it is. Any help would be appreciated. Code is below:

async function authenticate() {

    let authentication = await fetch(authenticate_url, {
        method: 'POST',
        header: 'content-type: application/x-www-form-urlencoded',
        data: `grant_type=refresh_token&client_id=${clientID}&client_secret=${client_secret}&refresh_token=${refresh_token}&username=${username}&password=${password}`

Error is as follows:

{type: "basic", url: "https://api.formlabs.com/developer/v1/o/token/", status: 401, statusText: "Unauthorized", ok: false…}
type: "basic"
url: "https://api.formlabs.com/developer/v1/o/token/"
status: 401
statusText: "Unauthorized"
ok: false
headers: Object
redirected: false

Troubleshooting issues with API requests is can be very tricky.
Based on the error message that you received it looks like you need to authenticate into the service. So, you need to look at the documentation for the service and see what type of credentials you need to pass in with your request.

From the documentation:

This is achieved by send an HTTP POST to https://api.formlabs.com/developer/v1/o/token/ with the following parameters in application/x-www-form-urlencoded content type:

  • “grant_type”: “refresh_token”
  • “client_id”: “your_client_id”
  • “client_secret”: “your_client_secret”
  • “refresh_token”: “your_refresh_token”
  • “username”: “your_username”

I have all of these elements in the data portion of the fetch function, but I don’t think they’re getting passed in correctly for some reason. I’m able to authenticate with no problems with CURL on the terminal using the following:

curl --request POST --url https://api.formlabs.com/developer/v1/o/token/ --header 'content-type:application/x-www-form-urlencoded' --data 'grant_type=refresh_token&client_id=my_clientID&client_secret=my_secret&refresh_token=my_token&username=my_username'

I was able to figure it out. I borrowed some code from this gist to format the body correctly and now it works.

async function authenticate() {
    let response = await fetch(authenticate_url, {
        method: 'POST',
        headers: { 'content-type': 'application/x-www-form-urlencoded' },
        body: JSON_to_URLEncoded(authenticateBodyData)

That was tricky!

1 Like

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