2017-08-01 1 views
0

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!

+0

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 –

+0

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. –

+0

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. :-) –

Répondre

1

Si vous utilisez votre navigateur, le navigateur vous permettra de vous connecter à google, puis de vous authentifier et de vous envoyer un authcode. Si vous souhaitez automatiser le processus à l'aide de PowerShell ou d'un script shell utilisez Resource Owner Password Credentials Grant où vous envoyez un nom d'utilisateur et un mot de passe dans le cadre de votre requête et le serveur renvoie le code d'authentification. Vous devez donc ouvrir dynamiquement le navigateur à partir de votre PowerShell et laisser les utilisateurs s'authentifier et une fois que les utilisateurs authentifiés doivent copier manuellement le code d'authentification dans votre console pour générer un jeton d'accès. Pour le rendre un peu facile, vous pouvez rediriger vers une page javascript qui ouvre une fenêtre avec le code d'autorisation. Par exemple redirect_uri=http://localhost:8899/getcode.html va ouvrir http://localhost:8899/getcode.html?code=xyz Si vous écrivez du code javascript à l'intérieur de getcode.html qui lit le paramètre de requête de code et affiche à l'utilisateur dans une fenêtre pop-up, il sera facile pour les utilisateurs de le copier.

Une autre approche est le schéma de redirection personnalisé. Ici, vous devez installer un schéma personnalisé. Ceci en tant qu'une autre application (vous pouvez invoquer un Shell ou un script batch) qui est ouvert après l'authentification. Vous écrivez votre propre code personnalisé pour copier le code d'authentification dans le presse-papiers et le lire dans PowerShell. (Cela peut éviter la pâte de copie manuelle).Référez-vous à http://edoceo.com/howto/xfce-custom-uri-handler

+0

Merci encore @Venkatesh Marepalli - vous êtes une véritable source d'informations sur le sujet. Cependant, nous semblons toujours être en train de communiquer. L'étape sur laquelle je suis n'est pas l'étape d'authentification. C'est l'étape d'autorisation. Je n'ai pas besoin de me connecter à Google pour effectuer cette étape manuellement. Je dois me connecter pour effectuer l'étape d'authentification, mais ce n'est pas l'étape que je décris. Qu'est-ce qui me manque ici? –

+0

Qu'entendez-vous par étape d'autorisation? obtenir le code d'autorisation? Faites-moi savoir ce que vous entendez par cette étape et ce qui se passe à la fin de cette étape, donc je vais avoir une compréhension claire –

+0

Le message original montre l'étape en question, et les résultats. Après avoir le code d'autorisation, on peut ensuite l'utiliser pour effectuer l'authentification, et obtenir ainsi un jeton d'accès. Je vais poster un exemple plus complet de la séquence de bout en bout le matin. –