l'essentiel est invisible pour les yeux

Tuesday, April 29, 2008

Edge Rails: Describes Gem Dependencies

So far today, Gem dependencies might be written with Capistrano, but we can write Gem dependencies in config/environemt.rb with Edge Rails, and it will be installed with Rake task.

# in config/enviroment.rb


config.gem 'hpricot'
config.gem 'aws/s3', '>= 0.4.0'
config.gem 'aws-s3', :lib => 'aws/s3', :version => '>= 0.4.0', :source => "http://code.whytheluckystiff.net"


Install all required Gems.
rake gems:install

Cool

Saturday, April 26, 2008

OpenID再利用問題

ドメインの更新忘れもOpenIDにおける脆弱性の一つ。

URLやXRIを入力するだけで、Yadisプロトコルに基づきOpenIDプロバイダーやi-Brokerを発見し、認証が行えるシステムは、とてもシンプルでありながら、WWWの分散アーキテクチャの上に構築された強力なエコシステムだ。しかし、問題は、私達自身の識別子として利用可能なURLやXRIは、永遠ではないことだ。

もしも、私達が利用しているOpenIDプロバイダがドメインの更新を忘れて、第三者にドメインが取得された場合、私達のアカウントがこの第三者により不正に使用される可能性が出てくる。myOpenIDや、多くのプロバイダでは、単純なルールに基づいた、Human FriendlyなOP-Local Identifierを提供してくれているが、ユーザは、セキュリティ的、高可用性の両方の側面からRelying Partyでのユーザ登録に、OP-Local Identifierを使用すべきではない。

もう少し、現実的に起こりえそうな問題は、OpenIDプロバイダにより特定のアカウントの持ち主が変更されたケースである。初めは、Aというユーザが、a.example.comというOP-Local Identifierを保持していたが、Aが退会して同じOP-Local IdentifierがBというユーザに渡った場合、Bは、AがOP-Local Identifierを用いて会員登録したRPにサインインして登録された情報に自由にアクセスすることができる。

もう一つの問題は、自分のHPのURLを識別子として利用した場合のリスクである。この場合、自分がドメインの更新を忘れて(または意図的に)、ドメインが第三者の手に渡ると、Relying Party上に残した私達の情報が、第三者に再利用される可能性が生まれる。

どちらの問題も、OPでのアカウントのExpireや移行がRPと同期できないために発生する問題である。
既存のOpenIDライブラリ(といっても、ruby-openidしか見ていない)では、OpenID URLの変更とアクティベーションのサンプルはついていないが、RPはこの機能を用意すべきだろう。

OpenID再利用問題一つとっても認証をOpenIDのみに踏み切るには、まだまだリスクが高い。

P.S.
念のため補足すると、XRIでは再利用の問題が起きない。これは、XRIが取得される度にi-Numberと呼ばれる全世界で一意な値を割り当てるからである。XRIでは、このi-NumberがClaimed Identifier(aka XRDS::XRD::CanonicalEquivID)になるからである。

myOpenIDなどユーザのセキュリティに対して十分な対応をしているプロバイダでは、一度取得されたアカウントは、退会した後も再利用される事は無いのでここに書いた問題は発生しない。ただし、退会後のアカウントについて明記していないプロバイダは要注意である。

Wednesday, April 23, 2008

DRY routing with form generated by Rails helper methods, shouldn't write routings directly in Javascript code.

The routing solution in Rails is pretty powerful, so we can modify routing easiliy. This facility may become cause of bugs. If we wanna submit data asynchronously with Javascript, then we have to write some routing paths in source of Javascript directly. It's not DRY and it doesn't work together with Rails routing solution.

So we think example code which post a comment to the article. We have two resources, articles, comments.


map.resources :articles, :has_many => [:comments]


In this case, I guess most people use helper methods which built in rails.

<% # The generated path (aka action) is same as "/articles/:article_id/comments" %>
<% remote_for_for([@article, Comment.new]) do |f| %>
<%= f.text_field :body %>
<%= submit_tag 'Post' %>
<% end %>


It's just simple, not a problem.

Imagine create a basket like shopping card, it supports drag and drop user interface. We can drag products or image into basket. This example has routings is as follows:

map.resource :basket, :has_many => [:items]


And we have to implement drag and drop user interface, following code is sample implementation with jQuery. It has URL where submits item data. If someone will change Rails routings, this code will be sucks.


$(function(){
// FIXME: It's not DRY
var ADD_ITEMS_TO_BASKET_PATH = '/basket/items';

$('img.draggableItem').draggable();
$('#basket').droppable({
drop: function(e) {
$.ajax({
url: ADD_ITEM_TO_BASKET_PATH,
type: 'post',
success: function(){}
});
}
});
});

So I guess we should use forms generated by Rails helper methods, and It set form's visibility is hidden. You set a required data into fields, and submit the form.

In Rails view:

<% remote_form_for([@basket, Item.new], :html => {:id => 'add_to_basket', :style => 'display:none'}) do |f| %>
<%= f.hidden_field :id %>
<%= submit_tag 'Add an item' %>
<% end %>

In Javascript:

$(function(){
$('img.draggableItem').draggable();
$('#basket').droppable({
drop: function(e, ui) {
var itemId = itemId(e.target);
var form = $('#add_to_basket');
form.find('> input[name="item[id]"]').val(itemId);
$('#add_to_basket > input[type="submit"]').click();
}
});
});


In this case, we don't need to write any routings directly in Javascript, so It's DRY.

Monday, April 21, 2008

rubyonrails.org isn't available now?

It might forget to update a domain name, so we can't see rubyonrails.org.


% whois rubyonrails.org
Last Updated On:20-Apr-2008 18:08:51 UTC
Expiration Date:19-Apr-2009 22:40:29 UTC


We can access rubyonrails.com, .net instead of .org.

See also
http://www.ruby-forum.com/topic/150274

Sunday, April 20, 2008

瀧内メソッドで開催された第0回OpenID勉強会に第一回はない

第0回OpenID勉強会が開催されました。

写真は、OpenID勉強会レポートより拝借。

全くのノープラン、セッションの詳細無しにも関わらず、20人ものOpenID野郎達が集まりました。
Identity界隈には、男しかいないのでしょうか。

参加者
全体的に、LL使いの人達が多く集まったようでした。プログラマではない方も2名いて、企業におけるOpenID導入における苦労話や、Yahoo!の中のアカウントをOpenID化する際のセキュリティポリシーに対する考えなどを話してもらえました。

全員参加型勉強会では、20人/セッションまで
今回もComet勉強会を彷彿とさせる、瀧内メソッドにより内容の充実した勉強会が開催できました。全員参加型のセッションが開催できるのは、このメソッドの良い所。しかし、最大の欠点が、続く第1回OpenID勉強会を開催するとすれば話す事が無い事。こちらもComet勉強会を彷彿とさせます。次回開催できるとすれば、OpenIDに限らず、より話を広げて、Digital Identity全体、Social Webなどの話になるかもしれません。

勉強会に来るプログラマには、ブラックボックスを刺激しろ
勉強会に足を運ぶプログラマたちは、「なぜかよくわからないけど動作している」といったブラックボックスが気になっているのではないでしょうか。OpenIDにおいても、ライブラリが充実しているので、「詳細がわからないけど、使えている。」「時間がなくて、動作原理やスペックを追えていない。」というプログラマが多いはず。勉強会中にも出ていた、「仕様書をしっかりと読み、動作原理を理解する事は、自信につながる」という話。今日から、「俺、OpenID知ってるぜ」と人に言えるようになったかも?しれません。

セッションの方は、ZIGOROuさんの飛び入りセッション2本も入り、とても充実。ありがとうございました。

懇親会は、6時間の長丁場
ピッチャーも10杯以上は出たのでは?という6時間の長丁場。懇親会は、勉強会第二ラウンド。こちらでは、OpenIDに止まらず、色々な話ができました。

今後のOpenID界隈の話は、次の場所で開催していますので、ご参加ください。

OpenID勉強会 hosted by rfurutani.

Join now


Chat about what's on your mind. More about public chats.


http://groups.google.com/group/openid-ja
IRC: #openid-ja@freenode

Special Thanks
Drecom (会場提供)
Genki (オーナー)

See also
OpenID勉強会レポート
id:ZIGOROu - OpenID勉強会に行って来ました
onk-san - OpenID 勉強会に行ってきました。
matake-san - OpenID勉強会@ドリコム恵比寿オフィス

Monday, April 14, 2008

OP Identifier and Claimed Identifier, easier OpenID Identifier.

It might be less well know, we can sign in with only OP Identifier(myopenid.com, yahoo.com etc.) into RP respond to OpenID authentication. For example, I have a myOpenID account in Rakuto Furutani. So I can sign in my OpenID URL (aka OP-Local Identifier), but I can also sign in into RP with only a OP's host name.



Why can we sign in with only a OP's host name(aka OP Identifier)?

1. First the OpenID library obtain Yadis Document from OP Identifier, It can emulate with curl script. This specification is part of a Yadis Specification.


% curl -H "Accept: application/xrds+xml" http://www.myopenid.com/

Take a response as XRDS

<?xml version="1.0" encoding="UTF-8"?>
<xrds:XRDS
xmlns:xrds="xri://$xrds"
xmlns="xri://$xrd*($v*2.0)">
<XRD>

<Service priority="0">
<Type>http://specs.openid.net/auth/2.0/server</Type>
<Type>http://openid.net/sreg/1.0</Type>
<URI priority="0">http://www.myopenid.com/server</URI>
</Service>

</XRD>
</xrds:XRDS>


The OpenID client can obtain OP Endpoint URL, "http://www.myopenid.com/server", and the client is initiate the OpenID Authentication request with obtained OP Endopoint URL. If authentication will be success, take a response(aka Positive Assertion). It includes such as some paramters is as follows:


{"openid.claimed_id"=>"http://rakuto.myopenid.com/",
"openid.mode"=>"id_res",
"openid.return_to"=>"http://localhost:3000/consumer/complete",
"openid.sig"=>"4fAHQGtaUgCjsrMAfue/Qi+k32w=",
"openid.ns"=>"http://specs.openid.net/auth/2.0",
"openid.op_endpoint"=>"http://www.myopenid.com/server",
"openid.response_nonce"=>"2008-04-14T13:27:18ZCEGxaV",
"openid.identity"=>"http://rakuto.myopenid.com/",
"openid.assoc_handle"=>"{HMAC-SHA1}{4e02f931}{EAZGvE==}",
"openid.signed"=>
"assoc_handle,claimed_id,identity,mode,ns,op_endpoint,response_nonce,return_to,signed"}


The client library can obtain Claimed ID from openid.identity, and it can also obtain our XRDS.

<?xml version="1.0" encoding="UTF-8"?>
<xrds:XRDS
xmlns:xrds="xri://$xrds"
xmlns:openid="http://openid.net/xmlns/1.0"
xmlns="xri://$xrd*($v*2.0)">
<XRD>

<Service priority="0">
<Type>http://specs.openid.net/auth/2.0/signon</Type>
<Type>http://openid.net/sreg/1.0</Type>
<Type>http://openid.net/extensions/sreg/1.1</Type>
<Type>http://schemas.openid.net/pape/policies/2007/06/phishing-resistant</Type>
<Type>http://openid.net/srv/ax/1.0</Type>
<URI>http://www.myopenid.com/server</URI>
<LocalID>http://rakuto.myopenid.com/</LocalID>
</Service>

<Service priority="1">
<Type>http://openid.net/signon/1.1</Type>
<Type>http://openid.net/sreg/1.0</Type>
<Type>http://openid.net/extensions/sreg/1.1</Type>
<Type>http://schemas.openid.net/pape/policies/2007/06/phishing-resistant</Type>
<Type>http://openid.net/srv/ax/1.0</Type>
<URI>http://www.myopenid.com/server</URI>
<openid:Delegate>http://rakuto.myopenid.com/</openid:Delegate>
</Service>

<Service priority="2">
<Type>http://openid.net/signon/1.0</Type>
<Type>http://openid.net/sreg/1.0</Type>
<Type>http://openid.net/extensions/sreg/1.1</Type>
<Type>http://schemas.openid.net/pape/policies/2007/06/phishing-resistant</Type>
<Type>http://openid.net/srv/ax/1.0</Type>
<URI>http://www.myopenid.com/server</URI>
<openid:Delegate>http://rakuto.myopenid.com/</openid:Delegate>
</Service>

</XRD>
</xrds:XRDS>



Conclusion
If you use URL as OpenID Identifier, then you don't need to input "http://" and your Claimed Identifier because It's client library's work. Your Claimed Identifier is obtained by RP, so you just have to input your OPs host name.

e.g.) myopenid.com or yahoo.com etc.

Wednesday, April 02, 2008

4/19 OpenID勉強会のお知らせ

via OpenID勉強会のお知らせ

OpenID勉強会を開催します。
ドリコムさんの御好意により会場を貸していただけるようです。
ありがとうございます!

  • 日時: 4/19(土) 13:30~18:00
  • 場所: 株式会社ドリコム ミーティングルーム (地図) 
  • 準備: OpenIDの基礎知識。ノートPC、e-mobileがあるとなお良いです


以下のオープンチャットで、OpenID勉強会に関する雑談を開催しています。対岸の人達が面白くしてくれるだろうでは、残念すぎます。国内から世界に盛り上げましょう。今後必要になるOpenID Extension、 SOAPとOpenDI、ユーザ属性の交換とOP間での同期、OpenIDの未来予測、OpenIDとビジネス、Openである事とDataWeb、 地球規模で一意な識別子XRI、クロスドメインアプリケーション、などなどアツくアツく語り合いましょう。

OpenID勉強会 hosted by rfurutani.

Join now


Chat about what's on your mind. More about public chats.