openid

OpenID の Attribute Exchange

弊社の OpenID 拡張の参考に。。色々調べてるところです。
mixi の OpenID が AX と SREG に対応してるとの事なので試してみた。

SREG は使った事あるので、今回は AX を実装。以下のような感じでちゃんとニックネーム取れた。
AXだと独自で拡張した野良フィールド足して返してもいいのかなぁ。

やはり、さらりと使いたい人用の SREG と色々追加の属性が取れる AX の両方を実装しておいた方がいいのだろうか。
# だいぶ適当
sub login : Local {
    my( $self, $c ) = @_;
    my $csr = Net::OpenID::Consumer->new(
        ua => LWP::UserAgent->new,
        args => $c->req->parameters,
        consumer_secret => 'xxx',
        required_root => 'http://localhost:3000',
    );
    my $identity = $c->req->param('identity');
    if ($c->req->param('openid-check')) {
        if (my $vident = $csr->verified_identity) {
            my $ax = $vident->signed_extension_fields(
                'http://openid.net/srv/ax/1.0',
            );
            # ニックネームとれた!
            return $c->res->body( join ':', $vident->url, $ax->{'value.nickname'} );
        }
    }
    elsif (my $claimed = $csr->claimed_identity($identity)) {
        $claimed->set_extension_args('http://openid.net/srv/ax/1.0', {
            mode => 'fetch_request',
            'type.nickname' => 'http://axschema.org/namePerson/friendly',
            required => 'nickname',
        });
        my $check_url = $claimed->check_url(
            delayed_return => 1,
            return_to => 'http://localhost:3000/login?openid-check=1',
            trust_root => 'http://localhost:3000',
        );
        return $c->res->redirect( $check_url );
    }
}

OpenID 実装した件

OpenIDを実装してみました。
このブログでもさっそく、delegate 設定しました。
とりあえず、サーバ側の提供ですが、OpenID を利用したサービスも何か出来るといいかなと思ってます。

実装自体は Net::OpenID::Server を使ったので非常に簡単でした。
一つハマったのが Net::OpenID::Server は Crypt::DH を使ってるのですが、Math::BigInt::Pari か Math::BigInt::GMP をインストールしておかないと非常に動作が遅くなってしまいます。
素の Math::BigInt を使ってても、遅いだけで正常に動作するのでなかなか気づきづらいです。。
Perl で OpenID 実装しようと思ってる方はご注意を。


Profile
  • ライブドアブログ