2010-05-21 18 views
14

Estoy trabajando en un proyecto y quiero iniciar sesión en Stack Overflow mediante cURL.Iniciando sesión en Stack Overflow con cURL

Utilizo Google como mi proveedor de acceso abierto, lo que significa que necesito iniciar sesión en Google primero a través de su API.

Aquí está el código que tengo hasta ahora:

#!/bin/sh 
. ./params.sh #the script with $username and $password 
curl --silent https://www.google.com/accounts/ClientLogin \ 
-d Email=$username -d Passwd=$password \ 
-d accountType=GOOGLE \ 
-d source=localhost-test-1 \ 
-d service=lso \ 
-o tokens 
. ./tokens 
echo $Auth; #$Auth is correct here - I did not get a BadAuth error. 

endpoint="https://www.google.com/accounts/o8/id"; 

curl http://stackoverflow.com/users/authenticate \ 
    -d "openid_identifier=$endpoint" \ 
    -w %{redirect_url}> ./google_url 
google_url=$(cat ./google_url); 
echo $google_url; 
echo; 
echo; 
echo; 
curl -L --silent --header "Authorization: GoogleLogin auth=$Auth" $google_url; 

En este punto llego a una página de Google me dice que el desbordamiento de pila quiere información y tengo que entrar Según this page, la parte --header ... $Auth. debe contar como inicio de sesión y redirigirme a Stack Overflow.

Aquí es la forma que tengo cuando ejecutar este script:

<form id="gaia_universallogin" 
     action="https://www.google.com/accounts/ServiceLoginAuth?service=lso" method="post"> 
    <input type="hidden" name="continue" id="continue" 
      value="https://www.google.com/accounts/o8/ud?st=SOME_KEY" /> 
    <input type="hidden" name="service" id="service" 
      value="lso" /> 
    <input type="hidden" name="dsh" id="dsh" 
      value="SOME_NEG_NUMBER" /> 
</form> 

Cuando intento la respuesta a continuación me sale el siguiente error:

Can't call method "attr" on an undefined value at - line 8. 
    curl: (3) <url> malformed 
--></style> 

aquí es la salida de google2.html

<form id="gaia_loginform"  
     action="https://www.google.com/accounts/ServiceLoginAuth?service=lso" method="post"    > 
    <input type="hidden" name="continue" id="continue"   value="https://www.google.com/accounts/o8/ud?st=RNADOM" /> 
    <input type="hidden" name="service" id="service"   value="lso" /> 
    <input type="hidden" name="dsh" id="dsh"   value="NEG_NUMEBER" /> 
    <input type="hidden"    name="GALX"    value="ABCD" /> 
    <input type="text" name="Email" id="Email" /> 
    <input type="password" name="Passwd" id="Passwd" > 
    <input type="checkbox" name="PersistentCookie" id="PersistentCookie" value="yes" 
    <input type="hidden" name='rmShown' value="1" /> 
    <input type="submit" class="gaia le button" name="signIn" id="signIn"     /> 
<input type="hidden" name="asts" > 
</form> 
+0

¿Ha intentado cambiar el UserAgent de curl? – ZyX

+1

ZyX - ¿Por qué razón tengo el cambio de UA? En este punto, ni siquiera está iniciando sesión ni mucho menos dándome el código específico de UA. –

+1

podría tener una característica de seguridad de no permitirle iniciar sesión con un agente de usuario de php ... –

Respuesta

9

El servicio de inicio de sesión de Google es específico del servicio particular que está utilizando (Ir a ogle docs vs Google Analytics vs Google Maps, etc.). El servicio que especificó (lh2) es específico de Google Picasa.

Por desgracia, no parece ser un código equivalente para OpenID (al menos, no es que yo pude encontrar!)

La página que regrese de Google debe contener un formulario de acceso. Si nos fijamos en eso, debería ser posible construir una invocación curl para iniciar sesión; eso debería redireccionarlo a SO (o a cualquier página de ID abierta en la que quiera iniciar sesión).

Resulta que hacerlo es un poco complicado, porque tiene que analizar algunos de los campos de formulario para enviarlos de vuelta a Google, y porque Google no envía una redirección HTTP directa, sino un documento HTML con una etiqueta <meta http-equiv="redirect" ...>. Y, por supuesto, debes habilitar las cookies. Pero todo esto es posible en una secuencia de comandos con rizos - las siguientes obras para mí:

#!/bin/bash 

# Utility function for parsing values out of an HTML form 
get_value() 
{ 
    local tagtype="$1" attrname="$2" attrvalue="$3" getattr="$4" 
    perl -MHTML::TreeBuilder - "[email protected]" <<EOF 
     @[email protected]; 
     \$h=HTML::TreeBuilder->new; 
     \$h->parse_file("$htmlfile"); 
     while (\$#args > 0) { 
      \$h=\$h->look_down(_tag => shift @args, 
           shift @args => shift @args); 
     } 
     print \$h->attr(shift @args); 
EOF 
} 

# Empty the cookie jar 
cj="cookiejar" 
rm -f "$cj" 

# Attempt to log in to SO. This will redirect to a google URL. 
endpoint="https://www.google.com/accounts/o8/id" 

google_url=`curl -L -s -S http://stackoverflow.com/users/authenticate \ 
    -d "openid_identifier=$endpoint" \ 
    -o /dev/null -b "$cj" -c "$cj" \ 
    -w %{url_effective}` 
echo $google_url 
echo 
echo 

# Retrieve the form from Google 
htmlfile=googleform.html 
curl -L -s -S -o "$htmlfile" -b "$cj" -c "$cj" "$google_url" 

# Parse out the form fields 
form_url=`get_value form id gaia_loginform action` 

fdsh=`get_value form id gaia_loginform input name dsh value` 
fcontinue=`get_value form id gaia_loginform input name continue value` 
fservice=`get_value form id gaia_loginform input name service value` 
fGALX=`get_value form id gaia_loginform input name GALX value` 
frmShown=`get_value form id gaia_loginform input name rmShown value` 
fsignIn=`get_value form id gaia_loginform input name signIn value` 

fEmail='INSERT LOGIN EMAIL HERE' 
fPasswd='INSERT PASSWORD HERE' 

# Submit the login form 
htmlfile=google2.html 
curl -L -s -S -o "$htmlfile" -b "$cj" -c "$cj" --data-urlencode dsh="$fdsh" \ 
    --data-urlencode continue="$fcontinue" \ 
    --data-urlencode service="$fservice" \ 
    --data-urlencode GALX="$fGALX" \ 
    --data-urlencode Email="$fEmail" \ 
    --data-urlencode Passwd="$fPasswd" \ 
    --data-urlencode rmShown="$frmShown" \ 
    --data-urlencode signIn="$fsignIn" \ 
    "$form_url" 

# Interpret the redirect 
redirect=`get_value meta http-equiv refresh content | sed "s/^.*'\(.*\)'.*$/\1/"` 

# Follow it 
htmlfile=google3.html 
curl -L -s -S -o "$htmlfile" -b "$cj" -c "$cj" "$redirect" 

(Tenga en cuenta que me parece que tienen una versión ligeramente diferente del rizo de usted, así que tuve que cambiar las -w opciones ligeramente; Supongo que mi versión funcionará para usted, pero es posible que deba modificarla.)

+0

Encontré el código de servicio en el formulario y cambié mi código anterior para que coincida con él ("lso") . Sin embargo, esto todavía no inicia sesión. –

+0

Lo que quise decir es que envíe el formulario usando curl ... si publica el contenido de ese formulario (solo el contenido de la etiqueta FORM) podría proporcionar más sugerencias. .. – psmears

+0

@psmears: Publiqué el formulario. –

Cuestiones relacionadas