HttpRequest for Spotify authorization

:information_source: Attention Topic was automatically imported from the old Question2Answer platform.
:bust_in_silhouette: Asked By simongaiteiro

Hi all!

I am trying to get authorization in my Spotify account to retrieve some data with no success (new to Godot and programming).

According to the official example (https://developer.spotify.com/documentation/general/guides/authorization-guide/):
curl -X "POST" -H "Authorization: Basic ZjM4ZjAw...WY0MzE=" -d grant_type=client_credentials https://accounts.spotify.com/api/token

Retrieves:

{
   "access_token": "NgCXRKc...MzYjw",
   "token_type": "bearer",
   "expires_in": 3600,
}

In Godot, I got the following code (GDScript, based on official example on docs (https://docs.godotengine.org/en/latest/tutorials/networking/http_request_class.html)):

extends CanvasLayer

func _ready():
	pass # Replace with function body.

func _on_Button_pressed():
	var url : String = "https://accounts.spotify.com/api/token"
	var headers = ["Authorization: Basic ZjM4ZjAw...WY0MzE="]
	var data_fields : Dictionary = {"grant_type" : "client_credentials"}
	var http : HTTPClient = HTTPClient.new()
	var data : String = http.query_string_from_dict(data_fields)
	
	$HTTPRequest_POST.request(url, headers, true, HTTPClient.METHOD_POST, data)

	print(url)
	print(headers)
	print(data)


func _on_HTTPRequest_POST_request_completed(result, response_code, headers, body):
	if result == HTTPRequest.RESULT_SUCCESS:
		if response_code == 200:
			print(body.get_string_from_utf8())
		else:
			print("http Error")
			print("")
			print(result)
			print("")
			print(response_code)
			print("")
			print(headers)
			print("")
			print(body.get_string_from_utf8())

And console output is:

https://accounts.spotify.com/api/token
[Authorization: Basic ZjM4ZjAw...WY0MzE=]
grant_type=client_credentials
http Error

0

400

[date: Fri, 26 Mar 2021 22:36:15 GMT, content-type: text/html; charset=utf-8, set-cookie: __Host-device_id=AQBoU23xYfSZOVf_AhBs6ky_5JVHvFuNma2JrEIQ1vhm8Bx9wxaFP2TjIzJ4EY7Ga7wF09wMDJCevmShdOzXzjiaFqcKchGQ5Ak;Version=1;Path=/;Max-Age=2147483647;Secure;HttpOnly;SameSite=Lax, content-security-policy: default-src 'self'; script-src 'self' https://www.google-analytics.com https://ssl.google-analytics.com https://www.google.com https://www.gstatic.com/recaptcha/ https://www.google.com/recaptcha/ https://accounts.scdn.co; img-src 'self' https://i.imgur.com https://d2mv8tnci56s9d.cloudfront.net https://profile-images.scdn.co https://*.scdn.co https://graph.facebook.com https://fbcdn-profile-a.akamaihd.net https://*.fbcdn.net https://platform-lookaside.fbsbx.com https://www.google.com https://www.google-analytics.com https://stats.g.doubleclick.net data: https://accounts.scdn.co; font-src 'self' data: https://sp-bootstrap.global.ssl.fastly.net https://fonts.gstatic.com https://accounts.scdn.co; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com/css2 https://accounts.scdn.co; frame-src 'self' https://www.spotify.com https://www.google.com https://app.adjust.com https://itunes.apple.com itms-apps: https://www.google.com/recaptcha/; connect-src 'self' https://www.google-analytics.com;, x-content-security-policy: default-src 'self'; script-src 'self' https://www.google-analytics.com https://ssl.google-analytics.com https://www.google.com https://www.gstatic.com/recaptcha/ https://www.google.com/recaptcha/ https://accounts.scdn.co; img-src 'self' https://i.imgur.com https://d2mv8tnci56s9d.cloudfront.net https://profile-images.scdn.co https://*.scdn.co https://graph.facebook.com https://fbcdn-profile-a.akamaihd.net https://*.fbcdn.net https://platform-lookaside.fbsbx.com https://www.google.com https://www.google-analytics.com https://stats.g.doubleclick.net data: https://accounts.scdn.co; font-src 'self' data: https://sp-bootstrap.global.ssl.fastly.net https://fonts.gstatic.com https://accounts.scdn.co; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com/css2 https://accounts.scdn.co; frame-src 'self' https://www.spotify.com https://www.google.com https://app.adjust.com https://itunes.apple.com itms-apps: https://www.google.com/recaptcha/; connect-src 'self' https://www.google-analytics.com;, sp-trace-id: db6ec545a42cc4a5, strict-transport-security: max-age=31536000, x-content-type-options: nosniff, content-encoding: gzip, vary: Accept-Encoding, server: envoy, Via: HTTP/2 edgeproxy, 1.1 google, Alt-Svc: clear, Transfer-Encoding: chunked]

<!DOCTYPE html>
<html ng-app="accounts" ng-csp>
  <head>
    <meta charset="utf-8">
    <title>Error - Spotify</title>
    <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no">
    <base href="/">
    <link rel="icon" href="https://accounts.scdn.co/oauth2/images/favicon.ace4d8543bbb017893402a1e9d1ac1fa.ico">
    <link href="https://accounts.scdn.co/oauth2/css/index.7ca2ccfe9264062ace80.css" media="screen" rel="stylesheet">
  </head>
  <body>
  <div class="head">
    <a class="spotify-logo" href="/" tabindex="-1" title="Spotify"></a>
  </div>

    <div class="container-fluid error">
      <div class="content">
        <h1 class="h1">Error</h1>
        <p>
          Oops! Something went wrong, please try again or check out our <a href="https://www.spotify.com/help">help area</a>.
        </p>
      </div>
    </div>
    <script async defer src="https://accounts.scdn.co/oauth2/js/error.6613958fda8d625b1d94.js" sp-error=''></script>
  </body>
</html>

I tested in Godot 4.0 as well as in Godot 3.2.3 with the same result.

How can I translate curl request over to a Godot script?