Skip to main content
Solved

401 error on fetch()


Forum|alt.badge.img+8

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

Best answer by Noah_Coleman

Noah_Coleman wrote:

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!

View original
Did this topic help you find an answer to your question?

3 replies

kuovonne
Forum|alt.badge.img+27
  • Brainy
  • 6001 replies
  • August 9, 2021

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.


Forum|alt.badge.img+8
  • Author
  • Inspiring
  • 21 replies
  • August 9, 2021

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'

Forum|alt.badge.img+8
  • Author
  • Inspiring
  • 21 replies
  • Answer
  • August 11, 2021
Noah_Coleman wrote:

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!


Reply