この記事は PlayCanvas Advent Calendar 2017 の15日目の記事です。
困る
PlayCanvasは基本オープン&シェアなサービスなので、パブリックプロジェクトは誰でも閲覧/複製できてしまうわけです。
外部ツール等と連携してコード内にAPI keyやtoken等を記載しなければいけないときは多々ありますが、平文で記載していると外部から閲覧されたり複製されて見えないところで再利用されてしまう恐れがあります。
forumに投げてみた
これを解決するために、attributeにpassword属性を持たせてフォークした際に外れるような仕様にすればよいのでは?と思い投げてみたところそれは意味ないと返事がきました
https://forum.playcanvas.com/t/solved-attribute-password/4579/2
やるならURLに?pass=hogehoge
のようにつなげて使ってね、という回答。わかるけどいちいちめんどくさいですよね。
ということで作ってみた。
attributeで宣言して、一度使うとwebStorageに格納され、次回以降はそこから参照されるような仕組みを書いてみました
var Password = pc.createScript('password');
Password.attributes.add("pass",{type:"string"});
// initialize code called once per entity
Password.prototype.initialize = function() {
if(this.pass){
if(document.domain == "launch.playcanvas.com"){
localStorage.setItem("pass",this.pass);
}
}else
{
if(localStorage.getItem("pass")){
this.pass = localStorage.getItem("pass");
}
else
{
window.open('about:blank','_self').close();
}
}
};
実行一度目はpasswordのattributeに入力しておく必要がありますが、以後はwebStorageから参照されるため空にしといてもよいです。誰かがフォークした後はwebStorageに格納されていないためウィンドウが強制終了するような仕組みになっています。
document.domainで開発環境のみ適用するようにしてあるので、デプロイする前はattributeにあらかじめ格納しておく必要があります。