iKnow! の OpenID で XRI をサポート & ruby-openid を日本語 XRI 対応に
昨日 OpenID Foundation Japan で NRI の崎村さんに「iKnow! の OpenID は XRI をサポートしてないですね」ってなことを言われたらしいので、iKnow! の OpenID を XRI に対応させました。
OpenID Authentication Plugin の XRI 対応は RailsのOpenID Authentication PluginをXRI対応にする方法 に書きましたが、OpenID::Yadis::XRI.identifier_scheme というメソッドが既にあったので、今回はそれを使いました。
-
module OpenIdAuthentication
-
# XRI support
-
def self.normalize_url_with_xri(identifier)
-
case OpenID::Yadis::XRI.identifier_scheme(identifier)
-
when :xri : identifier
-
when :uri : normalize_url_without_xri(identifier)
-
end
-
end
-
class <<self
-
alias_method :normalize_url_without_xri, :normalize_url
-
alias_method :normalize_url, :normalize_url_with_xri
-
end
-
end
で、久しぶりに @freexri に行ってみたら、「=名前*nov」とかとれるようになってました。いつのまにか XRI って日本語も使えるようになってるんですね。日本語 XRI は微妙だけど、一応対応しておきました。
ruby-openid が日本語 XRI に対応してなかったので、OpenID::Yadis::XRI.escape_for_iri_with_multibyte をちょっと変更する必要があります。
-
module OpenID::Yadis::XRI
-
def self.escape_for_iri_with_multibyte(xri)
-
esc = escape_for_iri_without_multibyte(xri)
-
esc.gsub!(/([\xC0-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}|[\xF0-\xF7][\x80-\xBF]{3})/e) { |char_match|
-
CGI::escape(char_match)
-
}
-
return esc
-
end
-
class <<self
-
alias_method :escape_for_iri_without_multibyte, :escape_for_iri
-
alias_method :escape_for_iri, :escape_for_iri_with_multibyte
-
end
-
end
これで OK なはずですが...
そもそも「=名前*nov」の Yadis が動いてないみたい...意味ねー(涙
...「@id*またけ」はちゃんと動いてるから、まぁ良しとしよう。
fuckin @freexri !!
ps.
ruby-openid は XRI のエラー処理が不十分なので、以下のパッチも当てておくと良いかと思います。
-
module OpenID
-
# XRI Error handling
-
def self.discover_xri_with_error_handling(xri)
-
discover_xri_without_error_handling(xri)
-
rescue OpenID::Yadis::XRI::XRIHTTPError => e
-
raise DiscoveryFailure.new("XRI is not valid: #{e.message}", nil)
-
end
-
class <<self
-
alias_method :discover_xri_without_error_handling, :discover_xri
-
alias_method :discover_xri, :discover_xri_with_error_handling
-
end
-
end












この記事がお役に立ちましたら、一言コメントもらえると嬉しいですm_ _m