J'essaie d'automatiser le processus d'acquisition d'un code d'autorisation OAuth2
à utiliser avec Google Sheets.Utilisation de PowerShell pour obtenir le code d'autorisation OAuth2 pour Google Sheets
J'ai créé l'URI du projet Google et enregistré avec la redirection de http://localhost/oauth2callback
J'ai obtenu avec succès le code d'autorisation manuellement en entrant cette URL dans Chrome:
https://accounts.google.com/o/oauth2/v2/auth
?redirect_uri=http%3A%2F%2Flocalhost%2Foauth2callback
&response_type=code
&client_id=##CLIENTID##
&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fspreadsheets
&access_type=offline
&include_granted_scopes=true
&state=state_parameter_passthrough_value
... puis extraire le code d'autorisation en le copiant sur l'URL résultant montre Chrome:
http://localhost/oauth2callback
?state=state_parameter_passthrough_value
&code=##AUTHCODE##
&scope=https://www.googleapis.com/auth/spreadsheets#
Mes tentatives de REPLI cate ce processus avec PowerShell échouent misérablement. Je pense qu'il me manque une compréhension fondamentale de la façon dont fonctionne tout ce truc de redirection HTTP. J'ai essayé plusieurs variantes sur le thème, y compris prendre le premier résultat de la redirection et le soumettre avec un autre appel Invoke-WebRequest
, mais peu importe ce que je fais, je ne reçois une valeur sur le premier appel, et seulement si je mettre -MaximumRedirection
-0
- et ce que je reviens ne m'a pas aidé:
Function getAuthorizationCode($cliids) {
$auturl = "https://accounts.google.com/o/oauth2/v2/auth?redirect_uri=http`%3A`%2F`%2Flocalhost`%2Foauth2callback`&response_type=code`&client_id=$cliids`&scope=https`%3A`%2F`%2Fwww.googleapis.com`%2Fauth`%2Fspreadsheets`&access_type=offline`&include_granted_scopes=true`&state=state_parameter_passthrough_value";
#$autrsp = Invoke-WebRequest -UseBasicParsing -Uri $auturl -UseDefaultCredentials -TimeoutSec 180 -ErrorAction SilentlyContinue;
$autrsp = Invoke-WebRequest -UseBasicParsing -Uri $auturl -UseDefaultCredentials -TimeoutSec 180 -MaximumRedirection 0 -ErrorAction Ignore;
$autrdi = "";
if ($autrsp.StatusCode -ge 300 -and $autrsp.StatusCode -lt 400) {
$autrdi = $autrsp.Headers.Location;
}
return $autrdi;
}
# Force main variables to be non-global
Function myMain($arglis) {
$cliids = "##CLIENTID##";
getAuthorizationCode $cliids;
}
# Force main variables to be non-global
myMain $Args;
Il en résulte:
https://accounts.google.com/ServiceLogin
?passive=1209600
&continue=https://accounts.google.com/o/oauth2/v2/auth
?redirect_uri%3Dhttp://localhost/oauth2callback
%26response_type%3Dcode
%26client_id%3D##CLIENTID##
%26scope%3Dhttps://www.googleapis.com/auth/spreadsheets
%26access_type%3Doffline
%26include_granted_scopes%3Dtrue
%26state%3Dstate_parameter_passthrough_value
%26from_login%3D1
%26as%3D##LOGINCODE##
&oauth=1
&sarp=1
&scc=1
Rien dans ce résultat redirect la valeur est le code d'autorisation, et aucun de mes effo rts d'utiliser l'information retournée m'a aussi donné un code d'autorisation.
J'ai parcouru un tas de résultats de recherche Google et StackOverflow et soit je cherche les mauvaises choses ou ne pas comprendre ce que je trouve.
Je suis perplexe. Quelqu'un peut-il m'aider à comprendre quelle direction je dois diriger ici?
Merci!
Avec votre PowerShell essayez-vous d'ouvrir le navigateur pour que l'utilisateur s'authentifie ou que vous vouliez que l'authentification soit également effectuée dans PowerShell? Si vous voulez vous authentifier avec le nom d'utilisateur et le mot de passe de powershell, vous devez utiliser https://tools.ietf.org/html/rfc6749#section-4.3 –
J'essaye d'effectuer la tâche pour récupérer un code d'autorisation directement avec Powershell, avec pas d'ouverture de navigateur. Merci pour le lien. J'ai besoin de le lire plus à fond, mais à première vue il semble couvrir l'étape d'acquisition d'un jeton d'authentification, pas le code d'autorisation. Si c'est le cas, ce n'est pas le pas que je fais. –
En outre, même si ce n'est pas la technique prescrite, le fait que le navigateur * puisse * produire l'URL résultante sans intervention humaine indique que l'information devrait être récupérable par un script PowerShell. C'est maintenant quelque chose d'une opportunité passionnante pour en savoir plus sur ce qui se passe dans les coulisses avec les navigateurs et HTTP et redirections (oh mon dieu!). Ainsi, tenter de reproduire le comportement serait non seulement amusant, mais sérieusement éducatif pour moi. Donc, j'aimerais vraiment comprendre comment effectuer cette étape dans PowerShell. :-) –