]> sipb.mit.edu Git - ikiwiki.git/blob - doc/bugs/openid_login_fails_wirth_Could_not_determine_ID_provider_from_URL.mdwn
More cautious escaping of environment values.
[ikiwiki.git] / doc / bugs / openid_login_fails_wirth_Could_not_determine_ID_provider_from_URL.mdwn
1 On some ikiwikis that I run, I get the following error on OpenID logins:
2
3     no_identity_server: Could not determine ID provider from URL.
4
5 > Is this fixed now that [[!debbug 738493]] has been fixed? --[[smcv]]
6
7 I seem recall having that error before, and fixing it, but it always seems to come back and I forget how to fix it. So I'll just open this bug and document it if i can figure it out... -- [[users/anarcat]]
8
9 The Perl module manual says:
10
11 >            "no_identity_server"
12 >               (CV) Tried to do discovery on a URL that does not seem to have any providers at all.
13
14 Yet on the server side, I see no request coming in on the OpenID provider... 
15
16 Adding debugging helps in figuring out wtf is going on:
17
18 ~~~~
19 anarcat@marcos:~$ diff -u ~/src/ikiwiki/IkiWiki/Plugin/openid.pm /usr/share/perl5/IkiWiki/Plugin/openid.pm
20 --- /home/anarcat/src/ikiwiki/IkiWiki/Plugin/openid.pm  2014-02-03 20:21:09.502878631 -0500
21 +++ /usr/share/perl5/IkiWiki/Plugin/openid.pm   2014-04-13 11:45:25.413297420 -0400
22 @@ -257,6 +256,7 @@
23         return Net::OpenID::Consumer->new(
24                 ua => $ua,
25                 args => $q,
26 +               debug => 1,
27                 consumer_secret => sub { return shift()+$secret },
28                 required_root => auto_upgrade_https($q, $cgiurl),
29         );
30 ~~~~
31
32 In my case, I see:
33
34
35 ~~~~
36 [Sun Apr 13 11:45:35.796531 2014] [cgi:error] [pid 7299] [client 162.223.3.24:39547] AH01215: [DEBUG Net::OpenID::Consumer] Cache MISS for https://id.koumbit.net/anarcat, referer: http://cats.orangeseeds.org/ikiwiki.cgi?do=signin&action=verify&openid_identifier=https%3A%2F%2Fid.koumbit.net%2Fanarcat
37 [Sun Apr 13 11:45:35.842520 2014] [cgi:error] [pid 7299] [client 162.223.3.24:39547] AH01215: [DEBUG Net::OpenID::Consumer] Cache MISS for https://id.koumbit.net/anarcat, referer: http://cats.orangeseeds.org/ikiwiki.cgi?do=signin&action=verify&openid_identifier=https%3A%2F%2Fid.koumbit.net%2Fanarcat
38 [Sun Apr 13 11:45:35.845603 2014] [cgi:error] [pid 7299] [client 162.223.3.24:39547] AH01215: [DEBUG Net::OpenID::Consumer] semantic info (https://id.koumbit.net/anarcat) = , referer: http://cats.orangeseeds.org/ikiwiki.cgi?do=signin&action=verify&openid_identifier=https%3A%2F%2Fid.koumbit.net%2Fanarcat
39 [Sun Apr 13 11:45:35.845672 2014] [cgi:error] [pid 7299] [client 162.223.3.24:39547] AH01215: [DEBUG Net::OpenID::Consumer] fail(no_identity_server) Could not determine ID provider from URL., referer: http://cats.orangeseeds.org/ikiwiki.cgi?do=signin&action=verify&openid_identifier=https%3A%2F%2Fid.koumbit.net%2Fanarcat
40 ~~~~
41
42 There are three places in the code the original error message happens:
43
44 * Net::OpenID::claimed_identity
45 * Net::OpenID::verified_identity
46 * Net::OpenID::_find_openid_server
47
48 We'll look at the last one because it's where the URL data is actually fetched.
49
50 [[!format perl """
51 sub _find_openid_server {
52     my Net::OpenID::Consumer $self = shift;
53     my $url = shift;
54     my $final_url_ref = shift;
55
56     my $sem_info = $self->_find_semantic_info($url, $final_url_ref) or
57         return;
58
59     return $self->_fail("no_identity_server") unless $sem_info->{"openid.server"};
60     $sem_info->{"openid.server"};
61 }
62 """]]
63
64 From there we look at `_find_semantic_info()`, which is supposed to hit the OpenID server, but doesn't somehow.... By cranking up debugging, we can see that the consumer fails to verify the HTTPS signature on the host:
65
66 ~~~~
67 [Sun Apr 13 11:58:30.284511 2014] [cgi:error] [pid 11141] [client 162.223.3.24:39563] AH01215: [DEBUG Net::OpenID::Consumer] url dump (https://id.koumbit.net/anarcat, SCALAR(0x3275ac0)) = 500 Can't verify SSL peers without knowing which Certificate Authorities to trust, referer: http://cats.orangeseeds.org/ikiwiki.cgi?do=signin&action=verify&openid_identifier=https%3A%2F%2Fid.koumbit.net%2Fanarcat
68 [Sun Apr 13 11:58:30.284551 2014] [cgi:error] [pid 11141] [client 162.223.3.24:39563] AH01215: , referer: http://cats.orangeseeds.org/ikiwiki.cgi?do=signin&action=verify&openid_identifier=https%3A%2F%2Fid.koumbit.net%2Fanarcat
69 [Sun Apr 13 11:58:30.284573 2014] [cgi:error] [pid 11141] [client 162.223.3.24:39563] AH01215: This problem can be fixed by either setting the PERL_LWP_SSL_CA_FILE, referer: http://cats.orangeseeds.org/ikiwiki.cgi?do=signin&action=verify&openid_identifier=https%3A%2F%2Fid.koumbit.net%2Fanarcat
70 [Sun Apr 13 11:58:30.284593 2014] [cgi:error] [pid 11141] [client 162.223.3.24:39563] AH01215: envirionment variable or by installing the Mozilla::CA module., referer: http://cats.orangeseeds.org/ikiwiki.cgi?do=signin&action=verify&openid_identifier=https%3A%2F%2Fid.koumbit.net%2Fanarcat
71 [Sun Apr 13 11:58:30.284597 2014] [cgi:error] [pid 11141] [client 162.223.3.24:39563] AH01215: , referer: http://cats.orangeseeds.org/ikiwiki.cgi?do=signin&action=verify&openid_identifier=https%3A%2F%2Fid.koumbit.net%2Fanarcat
72 ~~~~
73
74 To get this little wonder, I had to change the `_find_semantic_info()` as followed:
75
76 [[!format perl """
77 sub _find_semantic_info {
78     my Net::OpenID::Consumer $self = shift;
79     my $url = shift;
80     my $final_url_ref = shift;
81
82     my $doc = $self->_get_url_contents($url, $final_url_ref);
83     $self->_debug("url dump ($url, $final_url_ref) = " . $doc) if $self->{debug};
84     my $info = _document_to_semantic_info($doc);
85     $self->_debug("semantic info ($url) = " . join(", ", map { $_.' => '.$info->{$_} } keys %$info)) if $self->{debug};
86
87     return $info;
88 }
89 """]]
90
91 A minimal test case would be:
92
93 ~~~~
94 perl -e 'use LWPx::ParanoidAgent;
95   print $LWPx::ParanoidAgent::VERSION, " $]: ";
96   print length(LWPx::ParanoidAgent->new->get
97       ("https://id.koumbit.net/anarcat")
98       ->decoded_content), "\n";'
99 ~~~~
100
101 And the results vary according to the version of perl:
102
103 * wheezy: 1.07 5.014002: 5720
104 * jessie: 1.10 5.018002: 398
105
106 Thanks [jwz](http://www.jwz.org/blog/2014/03/apple-broke-lwp-in-a-new-and-exciting-way-on-10-9-2/) for that.. Mozilla::CA *could* have been packaged in Debian, except it overlaps with the `ca-certificates` package, so it was [basically barred entry](https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=702124).
107
108 I tried the workaround of hardcoding the path to the CA root, using `PERL_LWP_SSL_CA_PATH=/etc/ssl/certs`, but then I hit *another* bug in LWP: [#738493](https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=738493).
109
110 Note that this bug is similar to [[bugs/ssl_certificates_not_checked_with_openid/]], but backwards: it checks the SSL certs but then fails to verify.
111
112 I filed this bug in the Debian BTS as [#702124](https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=702124). Downgrading to wheezy's version of LWPx::ParanoidAgent doesn't fix the problem, instead i get this error:
113
114     500 Can't read entity body: Resource temporarily unavailable
115
116 ... yet the commandline client works fine... I'm out of ideas for this sucker.
117
118 Update: i found a way to reproduce the problem even with LWPx::ParanoidAgent 1.07:
119
120 ~~~~
121 $ perl -e 'use LWPx::ParanoidAgent;
122   print $LWPx::ParanoidAgent::VERSION, " $]\n";
123   $ua = new LWPx::ParanoidAgent; for (my $i = 0; $i< 10 ; $i++) { $c = LWPx::ParanoidAgent->new->get
124       ("https://id.koumbit.net/anarcat")
125       ->decoded_content; if (length($c) < 100) { print $c; } else { print length($c),"\n";}}'
126 1.07 5.018002
127 5720
128 500 Can't read entity body: Ressource temporairement non disponible
129 500 Can't read entity body: Ressource temporairement non disponible
130 500 Can't read entity body: Ressource temporairement non disponible
131 500 Can't read entity body: Ressource temporairement non disponible
132 500 Can't read entity body: Ressource temporairement non disponible
133 500 Can't read entity body: Ressource temporairement non disponible
134 500 Can't read entity body: Ressource temporairement non disponible
135 500 Can't read entity body: Ressource temporairement non disponible
136 500 Can't read entity body: Ressource temporairement non disponible
137 ~~~~
138
139 Workaround - disable error checking:
140
141 ~~~~
142 --- /home/anarcat/src/ikiwiki/IkiWiki/Plugin/openid.pm  2014-02-03 20:21:09.502878631 -0500
143 +++ /usr/share/perl5/IkiWiki/Plugin/openid.pm   2014-04-13 16:00:06.875744596 -0400
144 @@ -237,7 +237,7 @@
145
146         my $ua;
147         eval q{use LWPx::ParanoidAgent};
148 -       if (! $@) {
149 +       if (! $@ && 0) {
150                 $ua=LWPx::ParanoidAgent->new;
151         }
152         else {
153 ~~~~
154
155 > I get the same trouble with OpenID and some locally installed versions of IkiWiki on Debian wheezy (server) as well as on 13.10 Ubuntu (laptop). To be precise I hit the *other* bug in LWP: [#738493](https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=738493).
156 >
157 > My only workaround for now was to fix `PERL_LWP_SSL_VERIFY_HOSTNAME` to 0 directly in `ikiwiki` :-(  -- [[users/bbb]]
158
159 ~~~~
160 *** /home/bruno/opt/ikiwiki/bin/ikiwiki.bad     2014-04-17 15:41:38.868972152 +0200
161 --- /home/bruno/opt/ikiwiki/bin/ikiwiki 2014-04-17 15:04:56.524996905 +0200
162 *************** sub main () {
163 *** 226,229 ****
164         }
165   }
166   
167 ! main;
168 --- 226,229 ----
169         }
170   }
171   
172 ! $ENV{PERL_LWP_SSL_VERIFY_HOSTNAME} = 0 ; main;
173 ~~~~
174