Aug 09, 2021 12:08 PM
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
Solved! Go to Solution.
Aug 11, 2021 04:46 AM
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!
Aug 09, 2021 12:25 PM
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.
Aug 09, 2021 12:45 PM
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'
Aug 11, 2021 04:46 AM
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!