読者です 読者をやめる 読者になる 読者になる

mixiアプリで、OWNERの永続化がまだサポートされてなかった・・・。

mixi opensocial

mixi アプリを作ろうと思って、色々苦心している。


とりあえず、HTML表示や、jsでアラート表示なんかはできようになった。
あと、友達一覧とかも出せた。

OWNERの情報を永続化したい・・。

OWNERが入力した情報を、訪れたマイミクに公開するようなものを作りたかった。
そのためには、OWNERの情報として永続化したかったのだが、それがなぜかできない・・。

VIEWERの情報として永続化保存&取得

保存

var request = opensocial.newDataRequest();
var data = "test";
request.add(request.newUpdatePersonAppDataRequest(
        opensocial.IdSpec.PersonId.VIEWER, "key", data));
request.send();

取得

var request = opensocial.newDataRequest();
request.add(request.newFetchPersonRequest(
        opensocial.IdSpec.PersonId.VIEWER), "viewer");
var param = {};
param[opensocial.IdSpec.Field.USER_ID] = opensocial.IdSpec.PersonId.VIEWER;
var idSpec = opensocial.newIdSpec(param);
request.add(request.newFetchPersonAppDataRequest(idSpec, "key"), "viewer_data");
request.send(function (response) {
    if (response.hadError()) {
        // エラー処理
        alert("エラー");
        return;
    }
    var viewer = response.get("viewer").getData();
    var viewer_data = data[viewer.getId()];
    alert(viewer_data["key"]);
});


これはできる。

OWNERの情報として永続化保存&取得

保存

var request = opensocial.newDataRequest();
var data = "test";
request.add(request.newUpdatePersonAppDataRequest(
        opensocial.IdSpec.PersonId.OWNER, "key", data));
request.send();

取得

var request = opensocial.newDataRequest();
request.add(request.newFetchPersonRequest(
        opensocial.IdSpec.PersonId.OWNER), "owner");
var param = {};
param[opensocial.IdSpec.Field.USER_ID] = opensocial.IdSpec.PersonId.OWNER;
var idSpec = opensocial.newIdSpec(param);
request.add(request.newFetchPersonAppDataRequest(idSpec, "key"), "owner_data");
request.send(function (response) {
    if (response.hadError()) {
        // エラー処理
        alert("エラー");
        return;
    }
    var owner= response.get("owner").getData();
    var owner_data = data[owner.getId()];
    alert(owner_data["key"]);
});

これがなぜかできない・・・。


なぜだ〜〜。と思って調べた。

サポートされてないらしい

参考にさせていただいたのは、
ウェブ開発の次なる主戦場、Open Social
とか
OpenSocial-Japan
とか。
OpenSocialでOwnner毎 or Owner*アプリ毎の永続化方法
ここ。


結論から言うと、OWNERの永続化はサポート外らしいです。

現在のOpenSocialにて考えられているPersistence APIでの権限モデルは、ソーシャルグラフを強く意識したものです。その結果として、Friend間での共有、そしてViewerに対してのみの書き込み、という仕様となっています。加えて、アプリケーション間での共有は、それこそ何の保護もなければ、わかりやすいセキュリティホールになりますので、現状では仕様に含まれていません。

もし上記の制限を超えた実装を行いたい場合は、お察しの通り、gadgets.io.makeRequest()による外部サーバとのやり取りを行う必要があります。残念ながら、現状のOpenSocialの仕様は、「余計なことを考えなくても、永続化された情報に関して一定の保護を受けることができる」という理解をすることになるでしょう。厳しい制限と捉えるか、その厳しさ故に安全であると捉えるか、といったところでしょうか。

う〜〜ん。他の方法を考えよう。