Я работаю над проектом, и я хочу войти в Переполнение стека через ЗАВИХРЕНИЕ.
Я использую Google в качестве своего открытого поставщика, что означает, что я должен войти в Google сначала через его API.
Вот код, который я имею до сих пор:
#!/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;
В этой точке я получаю страницу от Google, говоря мне, что Переполнение стека хочет информацию, и я должен войти в систему. Согласно этой странице, --header ... $Auth
часть должна рассчитать как вход в систему и перенаправить меня к Переполнению стека.
Вот форма, которую я получаю, когда я запускаю этот скрипт:
Когда я пробую ответ ниже, я получаю следующую ошибку:
Can't call method "attr" on an undefined value at - line 8.
curl: (3) malformed
-->
вот вывод от google2.html
Служба входа в Google зависит от конкретной службы, которую вы используете (Google docs vs Google Analytics vs Google Maps и т. д.). Служба ode, которую вы указали (lh2), специфична для Google Picasa.
К сожалению, похоже, нет эквивалентного кода для OpenId (по крайней мере, я не смог найти!)
Страница, которую вы получите от Google, должна содержать форму входа. Если вы посмотрите на нее, должно быть возможно создать вызов curl для входа в систему; это должно перенаправить вас обратно на SO (или любую другую страницу openID, на которую вы хотите войти), если вы вошли в систему.
Оказалось, что сделать это немного сложно, потому что вам нужно разобрать некоторые поля формы, чтобы отправить их обратно в Google, и потому что Google отправляет обратно не прямой HTTP-перенаправление, а HTML-документ с тегом. И, конечно, вы должны включить cookies. Но все это возможно в сценарии с использованием curl - у меня работает следующее:
#!/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 - "$@" <<EOF
@args=@ARGV;
\$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"
(Обратите внимание, что у меня, похоже, немного другая версия curl, чем у вас, поэтому мне пришлось немного изменить параметры -w
; я предполагаю, что моя версия будет работать для вас, но вам, возможно, придется подправить ее)