Autoyaチェックリスト
概要
OverridePointsのこの項目をいい感じに改変できると良いと思う。特にセキュリティ的な部分で。
authentication handlers.
1.初回通信に使うバイナリキー、良い感じの形式のものを良い感じの暗号化して送るべき。
private IEnumerator OnBootAuthRequest(Action<Dictionary<string, string>, string> setHeaderAndDataToRequest)
{
// set boot body data for Http.Post to server.(if empty, this framework use Http.Get for sending data to server.)
var data = "some boot data";
// set boot authentication header.
var bootKey = AuthSettings.AUTH_BOOT;
var base64Str = Base64.FromBytes(bootKey);
var bootRequestHeader = new Dictionary<string, string> {
{"Authorization", base64Str}
};
setHeaderAndDataToRequest(bootRequestHeader, data);
yield break;
}
2.初回起動時のサーバからの通信に対して、クライアント側でチェックし、validかどうか判断すべき。validだったら、暗号化してtokenデータを保存する。
この例ではtokenしか保存していないが、refreshTokenも暗号化して保存する必要がある。
private IEnumerator OnBootAuthResponse(Dictionary<string, string> responseHeader, string data, Action<int, string> bootAuthFailed)
{
var isValidResponse = true;
if (isValidResponse)
{
Autoya.Persist_Update(AuthSettings.AUTH_STORED_FRAMEWORK_DOMAIN, AuthSettings.AUTH_STORED_TOKEN_FILENAME, data);
}
else
{
bootAuthFailed(-1, "failed to boot validation.");
}
yield break;
}
3.リフレッシュトークンの送信。保存してあるrefreshTokenを復号する必要がある。このコードではまんま保存しておいたtokenを送っているため、保存するところから変えないと行けない。
private IEnumerator OnTokenRefreshRequest(Action<Dictionary<string, string>, string> setHeaderToRequest)
// set refresh body data for Http.Post to server.(if empty, this framework use Http.Get for sending data to server.)
var data = "some refresh data";
// return refresh token for re-authenticate.
var refreshToken = Autoya.Persist_Load(AuthSettings.AUTH_STORED_FRAMEWORK_DOMAIN, AuthSettings.AUTH_STORED_TOKEN_FILENAME);
var base64Str = Base64.FromString(refreshToken);
var refreshRequestHeader = new Dictionary<string, string> {
{"Authorization", base64Str}
};
setHeaderToRequest(refreshRequestHeader, data);
yield break;
}
4.リフレッシュトークンの受信。validationしてOKだったら、新たに得たtokenとrefreshTokenを暗号化して保存。
private IEnumerator OnTokenRefreshResponse(Dictionary<string, string> responseHeader, string data, Action<int, string> refreshFailed)
{
var isValidResponse = true;
if (isValidResponse)
{
Autoya.Persist_Update(AuthSettings.AUTH_STORED_FRAMEWORK_DOMAIN, AuthSettings.AUTH_STORED_TOKEN_FILENAME, data);
}
else
{
// failsafe here.
// set result as failure.
refreshFailed(-1, "failed to refresh token.");
}
yield break;
}
authorized http request & response handlers.
5.JWTなどのdigest生成を行うのはここ。
private Dictionary<string, string> OnHttpRequest(string method, string url, Dictionary<string, string> requestHeader, string data)
{
var accessToken = Autoya.Persist_Load(AuthSettings.AUTH_STORED_FRAMEWORK_DOMAIN, AuthSettings.AUTH_STORED_TOKEN_FILENAME);
requestHeader["Authorization"] = Base64.FromString(accessToken);
return requestHeader;
}
6.レスポンスに対してのチェックを行うのはここ。(string)
private bool OnValidateHttpResponse(string method, string url, Dictionary<string, string> responseHeader, string data, out string reason)
{
// let's validate http response if need.
var isValid = true;
if (isValid)
{
reason = string.Empty;
return true;
}
else
{
reason = "run over by a bicycle.";
return false;
}
}
7.レスポンスに対してのチェックを行うのはここ。(byte[])
private bool OnValidateHttpResponse(string method, string url, Dictionary<string, string> responseHeader, byte[] data, out string reason)
{
// let's validate http response if need.
var isValid = true;
if (isValid)
{
reason = string.Empty;
return true;
}
else
{
reason = "run over by a bicycle.";
return false;
}
}
purchase feature handlers.
8.サーバ側が最新状態を持っているので、必要があれば課金関連のパラメータを更新する。
private void onPaidPurchaseDoneInBackground(string backgroundPurchasedProductId)
{
// server deployed some products for this player. update player's parameter if need.
}
AssetBundles handlers.
9.リストを保存する際に暗号化すると良い。
private AssetBundleList[] LoadAssetBundleListsFromStorage()
{
// load stored assetBundleList then return it.
var filePaths = Autoya.Persist_FileNamesInDomain(AssetBundlesSettings.ASSETBUNDLES_LIST_STORED_DOMAIN);
return filePaths.Select(
path => JsonUtility.FromJson<AssetBundleList>(
Autoya.Persist_Load(
AssetBundlesSettings.ASSETBUNDLES_LIST_STORED_DOMAIN, Path.GetFileName(path)
)
)
).ToArray();
}
10.リストを更新する際、暗号化すると良い。
private bool StoreAssetBundleListToStorage(AssetBundleList list)
{
var listStr = JsonUtility.ToJson(list);
var result = _autoyaFilePersistence.Update(AssetBundlesSettings.ASSETBUNDLES_LIST_STORED_DOMAIN, list.identity, listStr);
return result;
}
11.AssetBundleListのGet時に発効。CDNに何かしらアクセス保護を仕込んである場合、ここでパラメータを入れる。
private Dictionary<string, string> OnAssetBundleListGetRequest(string url, Dictionary<string, string> requestHeader)
{
return requestHeader;
}
12.PreloadListのGet時に発効。CDNに何かしらアクセス保護を仕込んである場合、ここでパラメータを入れる。
private Dictionary<string, string> OnAssetBundlePreloadListGetRequest(string url, Dictionary<string, string> requestHeader)
{
return requestHeader;
}
13.AssetBundleのGet時に発効。CDNに何かしらアクセス保護を仕込んである場合、ここでパラメータを入れる。
private Dictionary<string, string> OnAssetBundleGetRequest(string url, Dictionary<string, string> requestHeader)
{
return requestHeader;
}
ApplicationManifest handlers.
14.RuntimeManifestの上書き。暗号化すると良い。
private bool OnOverwriteRuntimeManifest(string data)
{
return _autoyaFilePersistence.Update(AppSettings.APP_STORED_RUNTIME_MANIFEST_DOMAIN, AppSettings.APP_STORED_RUNTIME_MANIFEST_FILENAME, data);
}
15.RuntimeManifestの取り出し。復号化すると良い。
private string OnLoadRuntimeManifest()
{
return _autoyaFilePersistence.Load(AppSettings.APP_STORED_RUNTIME_MANIFEST_DOMAIN, AppSettings.APP_STORED_RUNTIME_MANIFEST_FILENAME);
}