You might see that the Dropbox Community team have been busy working on some major updates to the Community itself! So, here is some info on what’s changed, what’s staying the same and what you can expect from the Dropbox Community overall.
Forum Discussion
Brad Henderson
4 months agoExplorer | Level 4
How to get an Access Token from a Refresh token from within B4A
Hello All, I have created a refresh token using the method thanks to "Здравко". Manually using a web browser and Windows Command prompt. The command prompt is: curl https://api.dropbox.com/oa...
- 4 months ago
Hi Brad Henderson,
To be honest I'm not familiar with the environment you're using. On the first look though, it uses OkHttp as underlying library. So you can take a look here for a simplistic example - example how OkHttp works. It may be easier for you to encode everything in the body (i.e. pass in the body text: "grant_type=refresh_token&refresh_token=<REFRESH_TOKEN>&client_id=<APP_KEY>&client_secret=<APP_SECRET>"; replace all "<...>" tags appropriately). Find what matches to desired OkHttp calls exactly in your environment (something, I believe you may do). 😉
Hope this helps.
PS: Just to avoid confusion: The example supposes JSON content, but in your case the content type is different, so instead of "application/json" (as is in the example) you have to set "application/x-www-form-urlencoded" as content type (MediaType in the example).
Brad Henderson
Explorer | Level 4
Greg,
I had a look at the documentation and it appears the command I need is this one:
curl https://api.dropbox.com/oauth2/token \ -d grant_type=refresh_token \ -d refresh_token=<REFRESH_TOKEN> \ -d client_id=<APP_KEY> \ -d client_secret=<APP_SECRET>
I have tried to apply this in my B4A code as follows:
Dim data As Map
data.Initialize
data.Put("grant_type", "refresh_token")
data.Put("refresh_token", "REFRESH_TOKEN")
data.Put("client_id", "APP_KEY")
data.Put("client_secret", "APP_SECRET")
Dim j As HttpJob
j.Initialize("", Me)
j.PostString("https://api.dropbox.com/oauth2/token",data.As(JSON).ToString)
j.GetRequest.SetContentType("application/json")
Wait For (j) JobDone(j As HttpJob)
If j.Success Then
Log(j.GetString)
Else
Log(j.ErrorMessage)
End If
j.Release
But I get this error:
ResponseError. Reason: , Response: {"error": "invalid_request", "error_description": "The request parameters do not match any of the supported authorization flows. Please refer to the API documentation for the correct parameters."}
While I realize you may not be familiar with this language, is there anything glaringly wrong from what you see?
Thanks Brad
Здравко
4 months agoLegendary | Level 20
Hi Brad Henderson,
I see, you have selected that url command as base for what you're going to do. I believe, you have the command tested and it works fine. Right?
Something I cannot understand though, where did you decide from that JSON is sended? 🤔 There is a way to check this. Add one more option to the curl command - '-v' option (from verbose). You will see a lot of things in your terminal - all that curl sends as request and receives back as response. This includes header blocks of both request and response. In both header blocks are corresponding Content-Type headers. Check what curl sends as request content type and tell us is it json or something else.
PS: Bear in mind that when you scroll your terminal back, the response (the later one) will be visible before the request (something that's first in time).
- Brad Henderson4 months agoExplorer | Level 4
Thanks Здравко,
Changed from JSON to "application/x-www-form-urlencoded" then created a string for the other variables in a string using a string builder.
Works perfectly.
Thanks again
Brad
- Brad Henderson4 months agoExplorer | Level 4
Здравко,
I think I jumped the gun. While this worked to produce a string:
Token is = {"access_token": "<ACCESS_TOKEN>", "token_type": "bearer", "expires_in": 14400}
I then extracted the ACCESS_TOKEN from this returned string, beginning with "sl.B7I.......etc".
I then substituted this access token into the code where I previously submitted the access token that I received when using this method:
But I get the error:
(BadRequestException) com.dropbox.core.BadRequestException: Error in call to API function "files/download": Invalid authorization value in HTTP header "Authorization": etc ..... Expecting "Bearer <oauth2-access-token>".
So I need to find the correct command to submit the new access token received from the refresh token request.
As there is not an API for my B4X language, how would I use the new access token to gain access to my Dropbox data?
I thought I was there..
- Здравко4 months agoLegendary | Level 20
Brad Henderson wrote:...
So I need to find the correct command to submit the new access token received from the refresh token request.
...
I don't know what exactly you are doing, but access token is always the same (I mean as type). The only thing you need to do when access token expires is to make refresh request and then use the just received access token in the place of the previous one. You don't need anything more. This may continue for so much seconds as pointed in "expires_in" field (when the just received token will expire) and then once again - new refresh, etc. Did you do in your code everything as needed?
Take a look in another post here for a possible way to implement your authorization and then you may use just as variable/field - always the same (the same variable name I mean, not the same value - the value will autoupdate on its own).
- Brad Henderson4 months agoExplorer | Level 4
Thank you Здравко,
I don't think I know exactly what I am doing either... But knowing that it is used exactly as the other, I manually supplied the token in the code to test and it worked, so my problem is coming from when I receive the Refresh Token Request and isolate the new access token from that string. Changed the method of doing that and it now works. I saved the new access token to an element in an array and retrieved it from there and it works.
Thanks again
Thanks
About Discuss Dropbox Developer & API
Make connections with other developers
795 PostsLatest Activity: 2 days agoIf you need more help you can view your support options (expected response time for an email or ticket is 24 hours), or contact us on X or Facebook.
For more info on available support options for your Dropbox plan, see this article.
If you found the answer to your question in this Community thread, please 'like' the post to say thanks and to let us know it was useful!