Edited at

【PlayCanvas】keyやtoken等見せたくないものをpublicプロジェクトで使用するときの対処法

More than 1 year has passed since last update.

この記事は 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に格納され、次回以降はそこから参照されるような仕組みを書いてみました


password.js

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にあらかじめ格納しておく必要があります。