Impossible d'obtenir le jeton d'accès de l'API OAuth Google pour les applications installées

Je crée un flux d'authentification OAuth afin que les utilisateurs de mon application installée puissent accéder à leurs documents de table de calcul Google privés. Je codifie avec Adobe ExtendScript, donc je ne peux pas utiliser les bibliothèques de clients Javascript que Google fournit. J'ai lu la documentation OAuth 2.0 de Google pour les applications installées plusieurs fois, mais j'ai besoin d'aide pour un aspect du flux OAuth. Je peux obtenir un code d'autorisation en lançant un navigateur à partir de l'application installée et en demandant à l'utilisateur de soumettre ses informations d'identification, puis de copier et de coller le code d'autorisation dans l'application. Cependant, lorsque je POST au point d'extrémité pour échanger le code d'autorisation pour un jeton d'accès, cela ne fonctionne pas. Le corps de la réponse de Google montre ceci:

Moved Temporarily The document has moved <A HREF="https://accounts.google.com/o/oauth2/token">here</A>. 

Et pourtant, j'ai fait l'appel POST à ​​cette même URL exacte trouvée dans la balise href. Donc, je ne sais pas pourquoi google me dirait que le point final s'est déplacé temporairement lorsque j'ai POSTÉ à cette même URL. Voici le code que j'utilise pour générer le POST.

 function getAccessToken(authcode) { var http = require('http'), OAuthAccessEndPoint = 'https://accounts.google.com/o/oauth2/token', OAuthAccessParams = {}; OAuthAccessParams['code'] = authcode; OAuthAccessParams['client_id'] = '{my_client_id}'; OAuthAccessParams['client_secret'] = '{my_client_secret}'; OAuthAccessParams['redirect_uri'] = 'urn:ietf:wg:oauth:2.0:oob'; OAuthAccessParams['grant_type'] = 'authorization_code'; var response = http.post(OAuthAccessEndPoint, OAuthAccessParams); } 

Le message est bien rendu, mais est-ce que quelqu'un sait pourquoi cet avis «déplacé temporairement» apparaîtrait dans la réponse de google? Les suggestions sont très appréciées!

EDIT: Juste pour clarifier, voici la demande que mon script est en cours de création:

 POST /o/oauth2/token HTTP/1.1 User-Agent: Adobe ExtendScript Accept: */* Connection: close Host: accounts.google.com Content-Type: application/x-www-form-urlencoded Content-Length: 226 code={authcode}&client_id={my_client_id}&client_secret={my_client_secret}&redirect_uri=urn:ietf:wg:oauth:2.0:oob&grant_type=authorization_code& 

Si j'utilise le code d'autorisation dans cURL, avec les autres paramètres, je reçois une réponse réussie des serveurs OAuth de Google. Donc, évidemment, il y a un problème avec la façon dont mes sockets interagissent avec les points d'extrémité de Google, mais je ne suis pas sûr de quoi. Est-il possible que certains composants doivent être codés par URI, alors que d'autres ne le font pas? Voici le CURL que j'utilise:

 #!/bin/bash AUTHCODE="$1" POSTCONTENT="code=$AUTHCODE&client_id={my_client_id}&client_secret={my_client_secret}&redirect_uri=urn:ietf:wg:oauth:2.0:oob&grant_type=authorization_code&" echo $POSTCONTENT curl -v --data $POSTCONTENT https://accounts.google.com/o/oauth2/token 

EDIT 2: Donc, puisque Sockets ne prennent pas en charge SSL dans Extendscript, j'ai écrit une fonction qui utilise des appels de niveau OS pour invoquer la requête. Si sur OSX, nous pouvons supposer que nous avons accès à CURL, mais sur Windows, nous devons écrire un VBScript exécuté via l'hôte cscript dans la ligne de commande. Pour ExtendScript, voici la fonction qui fait la demande Web:

 function webRequest(method, endpoint, query){ var response = null, wincurl = WORKING_DIR.fsName + '\\lib\\curl.vbs', curlCmd = ''; try { if ( os() == "Win" ) { curlCmd = 'cscript "' + wincurl + '" /Method:' + method + ' /URL:' + endpoint + ' /Query:' + query + ' //nologo'; } else { if (method === "POST") { curlCmd = 'curl -s -d "' + query + '" ' + endpoint; } else if (method === "GET") { curlCmd = 'curl -s -G -d "' + query + '" ' + endpoint; } } response = system.callSystem(curlCmd); } catch (err) { alert("Error\nUnable to make a `"+ method +"` request to the network endpoint. Please try again."); } return response; } function os(){ var os = system.osName; if (!os.length) { os = $.os; } app_os = ( os.indexOf("Win") != -1 ) ? "Win" : "Mac"; return app_os; } 

Et voici le script VBScript appelé dans la bibliothèque ExtendScript. Il faut trois params, toutes les cordes:

 set namedArgs = WScript.Arguments.Named sMethod = namedArgs.Item("Method") sUrl = namedArgs.Item("URL") sRequest = namedArgs.Item("Query") HTTPPost sMethod, sUrl, sRequest Function HTTPPost(sMethod, sUrl, sRequest) set oHTTP = CreateObject("Microsoft.XMLHTTP") If sMethod = "POST" Then oHTTP.open "POST", sUrl,false ElseIf sMethod = "GET" Then oHTTP.open "GET", sUrl,false End If oHTTP.setRequestHeader "Content-Type", "application/x-www-form-urlencoded" oHTTP.setRequestHeader "Content-Length", Len(sRequest) oHTTP.send sRequest HTTPPost = oHTTP.responseText WScript.Echo HTTPPost End Function 

Vous pouvez l'utiliser dans ExtendScript pour n'importe quel point d'extrémité de l'API, mais la réponse sera toujours une chaîne. Donc, dans le cas des points d'extrémité OAuth de Google, vous obtiendrez une chaîne qui ressemble à JSON. Alors, il faudra l'analyser avec quelque chose comme JSON.parse ().

Voir les modifications ci-dessus pour la réponse à cette question. Essentiellement, il s'est transformé en objets Socket dans ExtendScript ne prenant pas en charge SSL. La solution ci-dessus montre une solution de contournement en utilisant la méthode ExtendScript system.callSystem () pour accéder à cURL sur OSX et un VBScript sur Windows.