Uso de la documentación de Spotify para el flujo de credenciales del cliente aquí :
Pude crear una solicitud de API en el script de la aplicación de Google (Javascript).
function callAPI () { SPOTIFY_CLIENT_SECRET = secret SPOTIFY_CLIENT_ID = id const HEADERS = { "Content-Type": "application/json", 'Authorization': `Basic ${Utilities.base64Encode(SPOTIFY_CLIENT_ID + ':' + SPOTIFY_CLIENT_SECRET)})` } const BODY = { 'grant_type': 'client_credentials' } var url = `https://api.spotify.com/api/token` var requestOptions = { 'method': 'POST', 'headers': HEADERS, 'payload': JSON.stringify(BODY), 'muteHttpExceptions': true, 'redirect': 'follow' }; var response = UrlFetchApp.fetch(url, requestOptions); var data = JSON.parse(response.getContentText());Estoy confundido acerca de dos cosas, por favor sea capaz de responder a ambas.
1). La documentación de Spotify indica ingresar "Básico" antes de las credenciales del cliente en el encabezado de autorización.
Sin embargo, cuando ejecuto este código, aparece este error
{ error: { status: 400, message: 'Only valid bearer authentication supported' } }Si estoy usando el flujo de credenciales del cliente, ¿por qué cree que estoy usando un token de portador? (Además, si cambio la autenticación a Bearer, obtengo un error 401 "Token de acceso no válido")
2). ¿Podría proporcionar un ejemplo de una versión funcional de este código y por qué pudo ejecutarse de forma opuesta a la mía?
Creo que su objetivo es el siguiente.
Desea convertir el siguiente comando curl a Google Apps Script.
curl -X "POST" -H "Authorization: Basic ZjM4ZjAw...WY0MzE=" -d grant_type=client_credentials https://accounts.spotify.com/api/token En este caso, grant_type=client_credentials se envía como datos del formulario. Cuando vi su secuencia de comandos, se envía como los datos. Y usa la URL de https://api.spotify.com/api/token . Pero el comando curl usa https://accounts.spotify.com/api/token . `Pensé que esto podría ser la razón de su problema. Entonces, cuando se modifica su script, se convierte en lo siguiente.
function callAPI() { SPOTIFY_CLIENT_SECRET = secret; // Please set your value. SPOTIFY_CLIENT_ID = id; // Please set your value. const HEADERS = { 'Authorization': `Basic ${Utilities.base64Encode(SPOTIFY_CLIENT_ID + ':' + SPOTIFY_CLIENT_SECRET)}` // Modified } const BODY = { 'grant_type': 'client_credentials' } var url = "https://accounts.spotify.com/api/token"; var requestOptions = { 'method': 'POST', 'headers': HEADERS, 'payload': BODY, 'muteHttpExceptions': true, }; var response = UrlFetchApp.fetch(url, requestOptions); var data = response.getContentText(); console.log(data) }Basic ${Utilities.base64Encode(SPOTIFY_CLIENT_ID + ':' + SPOTIFY_CLIENT_SECRET)}) . Porque en este caso, es Basic ###) . Por favor elimine ) .¡Me lo imaginé! Por alguna razón, debe agregar la identificación del cliente y el secreto del cliente en los datos del formulario. Los documentos de Spotify dicen que los coloque en los encabezados codificados en base64, pero ese no es el caso en este caso. (Ni siquiera necesita codificarlos)
Además, ni siquiera necesita incluir el parámetro de tipo de contenido como dice el documento.
el código de trabajo se ve así
function callAPI () { let SPOTIFY_CLIENT_SECRET = secret let SPOTIFY_CLIENT_ID = id const BODY = { 'Content-Type': 'application/x-www-form-urlencoded', 'grant_type': 'client_credentials', "client_id": SPOTIFY_CLIENT_ID, "client_secret": SPOTIFY_CLIENT_SECRET, } var url = "https://accounts.spotify.com/api/token"; var requestOptions = { 'method': 'POST', 'payload': BODY, 'muteHttpExceptions': true, }; var response = UrlFetchApp.fetch(url, requestOptions); var data = response.getContentText(); console.log(data) }Encontré mi respuesta al leer sobre un problema similar aquí