Quick fix for #2659: unable to login with Livejournal OpenID

The Net::OpenID::Server perl module that LJ uses appears to be very picky about input, and rejects most request types unless the data comes in as GET parameters (apparently following OpenID 1.1 rules, rather than OpenID 2.0 rules which permit any request to be POSTed but requires that if so, the data must all be in the POST body).
Apparently something got updated on LJ at some point that's either added that behavior or (more likely) added the OpenID 2.0 namespace info to discovery, which tells the Janrain-based OpenID libraries that they should go ahead and do POST requests instead of redirects to GET requests... thus breaking everything. ;)

GET should be just fine for both 1.1 and 2.0 though, and also saves having to sit through that lame autosubmit page.

Switched the authentication submission from checking whether it should redirect to GET or do a form POST, to simply always doing the redirect to GET.

Tested against providers:
* LiveJournal
* Google
* LaunchPad
* identi.ca
This commit is contained in:
Brion Vibber 2010-09-07 16:15:32 -07:00
parent 7ad43e19d9
commit 961aba68fc

View File

@ -182,7 +182,19 @@ function oid_authenticate($openid_url, $returnto, $immediate=false)
$trust_root = common_root_url(true); $trust_root = common_root_url(true);
$process_url = common_local_url($returnto); $process_url = common_local_url($returnto);
if ($auth_request->shouldSendRedirect()) { // Net::OpenID::Server as used on LiveJournal appears to incorrectly
// reject POST requests for data submissions that OpenID 1.1 specs
// as GET, although 2.0 allows them:
// https://rt.cpan.org/Public/Bug/Display.html?id=42202
//
// Our OpenID libraries would have switched in the redirect automatically
// if it were detecting 1.1 compatibility mode, however the server is
// advertising itself as 2.0-compatible, so we got switched to the POST.
//
// Since the GET should always work anyway, we'll just take out the
// autosubmitter for now.
//
//if ($auth_request->shouldSendRedirect()) {
$redirect_url = $auth_request->redirectURL($trust_root, $redirect_url = $auth_request->redirectURL($trust_root,
$process_url, $process_url,
$immediate); $immediate);
@ -194,6 +206,7 @@ function oid_authenticate($openid_url, $returnto, $immediate=false)
} else { } else {
common_redirect($redirect_url, 303); common_redirect($redirect_url, 303);
} }
/*
} else { } else {
// Generate form markup and render it. // Generate form markup and render it.
$form_id = 'openid_message'; $form_id = 'openid_message';
@ -219,6 +232,7 @@ function oid_authenticate($openid_url, $returnto, $immediate=false)
$action->handle(array('action' => 'autosubmit')); $action->handle(array('action' => 'autosubmit'));
} }
} }
*/
} }
# Half-assed attempt at a module-private function # Half-assed attempt at a module-private function