Subscribed unsubscribe Subscribe Subscribe

OpenSocialアプリの外部サーバー側の認証について勉強中

OpenSocialアプリで外部サーバーとデータをやり取りする場合、なりすましによる不正アクセスを防ぐためにサーバー側でリクエストの認証を行う必要がある。
で、これには「署名付きリクエスト」をOpenSocialコンテナ側で送れるようになっていて、gadgets.io.makeRequest送信時に、パラメータでgadgets.io.RequestParameters.AUTHORIZATIONの値をgadgets.io.AuthorizationType.SIGNEDに指定すると署名付きリクエストとしてサーバー側に送信できるらしい。

var url = "...";
var callback = function(res) {
...
};
var params = {};
params[gadgets.io.RequestParameters.AUTHORIZATION] = gadgets.io.AuthorizationType.SIGNED;
gadgets.io.makeRequest(url, callback, params);

と、こんなカンジで外部サーバーにリクエストを行うと、リクエストのパラメータに色んなものが付加される。
という話がこのあたり。
http://wiki.opensocial.org/index.php?title=Introduction_To_Signed_Requests#Making_a_signed_request_in_JavaScript


で、そのリクエストを検証する方法が以下のページにまとまってたりする。
http://wiki.opensocial.org/index.php?title=Validating_Signed_Requests
…のだけど、これらは公開鍵を使って検証するRSA-SHA1方式のものに対する検証方法?HMAC-SHA1だとOpenSocialコンテナから発行されたconsumer_keyとconsumer_secretを使わないといけないような気がする。


RSA-SHA1方式はOpenSocialコンテナが公開している公開鍵で検証を行う。これはOpenSocialコンテナ側でその公開鍵でないと解けないものを作ることになるので、第三者が同じようなリクエストを作ろうとしてもできない。
従って、外部サーバー側ではその公開鍵を使ってリクエストを検証することによって「そのOpenSocialコンテナから送信されてきたリクエストである」ということを検証できる。
ただ、この方式ではそれ以上のことは検証できないので、例えば同一のOpenSocialコンテナの別アプリからのリクエストがきた場合も検証は通ってしまう。第三者が別アプリからそのサーバーへリクエストを送ることでなりすましができてしまう。


ので、そういうことをされないようにするために、OpenSocialコンテナ側で自動的に付加されるパラメータでさらに検証を行う必要がある。

といったパラメータは署名付きリクエストで検証したものなら信用していい値なので、これが対象となるアプリからのリクエストであるかどうかを確認して初めて他のパラメータを使った処理をする、ということが必要になる。


…という理解でいいのかな?