Verifying a submitted identity
Martin Atkins
mart at degeneration.co.uk
Wed May 25 01:52:41 PDT 2005
Those who have read the source to my OpenID Guestbook demo will probably
have seen the hack I used to get the library to validate the signature
during the final request when the guestbook entry is actually logged.
The API works fine for dealing with the return from the ID server, and
my code then puts the ID URL, timestamp and signature in hidden form
elements which get submitted along with the comment.
Of course, in this last request the form values aren't using the same
field names as OpenID uses to return the data the first time (and they
can't, because otherwise the code can't distinguish between the two
requests) so the Consumer perl module can't validate it with a little
help. The hack is to make a fake list of parameters and trick the
consumer module into using it:
$c->args({
'openid.mode' => 'id_res',
'openid.sig' => $vars->{oid_sig},
'openid.assert_identity' => $oid_url,
'openid.return_to' => '...',
'openid.timestamp' => $vars->{oid_ts},
});
Clearly this is not ideal. My first thought was for an API function
which can just take a (id, sig, timestamp, return_to) tuple and operate
on that as does the current verified_identity() method does on the
matching form arguments. Brad thinks that might break the ability to add
support for nonces, though, and suggested I raise it on the list.
After pondering this a bit, it seems to me that the nonce could just be
kept in the valid list until the whole process is complete, also
including it in a hidden form field for example. However, this means
that the nonce gets thrown back and forth a few times before it's
actually used and invalidated, which might be harmful. I'm not sure.
Any thoughts?
(Obviously, most "big" applications will be able to track people using
session cookies and such, so this form-passing trickery is unnecessary.
My guestbook app, though, is a good example of a simple app which can't
do any of that fancy state-requiring stuff very easily. As a side-effect
it's valnerable to replay, but something as trivial as a guestbook
doesn't really warrant all of the complication and overhead of tracking
state, in my opinion. An easy improvement would be to limit how far in
the past the timestamp can be, as we've discussed previously.)
More information about the yadis
mailing list