WebGL での Google Cloud Functions の関数の使用
遭遇した問題
UnityWebRequest で Google Cloud Functions の関数を使用する際、エディタ上では正常に動作するが、WebGL にビルドして Web ページ上で実行すると「UnityWebRequest.Result.ConnectionError」が発生し、「Method doesn’t allow unregistered callers (callers without established identity). Please use API Key or other form of API consumer identity to call this API.」と返って来る。
このメソッドでは、未登録の呼び出し元(IDが確立されていない呼び出し元)を許可していません。このAPIを呼び出すには、APIキーまたは他の形式のAPIコンシューマーIDを使用してください。
DeepL
原因
Google Cloud Functions 側でCORSが適切に設定されておらず、リクエストがはじかれてしまっている。
CORS は日本語訳すると オリジン間リソース共有 でした。つまり CORS とは、
なんとなく CORS がわかる…はもう終わりにする。あるオリジンで動いている Web アプリケーションに対して、別のオリジンのサーバーへのアクセスをオリジン間 HTTP リクエストによって許可できる仕組み
の事を言います。
対処法
Google Cloud Functions の関数内に下記のコードを追加する。
(C# の場合)
public async Task HandleAsync(HttpContext httpContext)
{
HttpRequest httpRequest = httpContext.Request;
HttpResponse httpResponse = httpContext.Response;
//どのオリジンからでも使用可能にする
httpResponse.Headers.Append("Access-Control-Allow-Origin", "*");
//リクエストの種類が「OPTIONS」なら
if (HttpMethods.IsOptions(httpRequest.Method))
{
//特定のメソッドを許可する
httpResponse.Headers.Append("Access-Control-Allow-Methods", "GET, POST, OPTIONS");
//特定のヘッダーを許可する
httpResponse.Headers.Append("Access-Control-Allow-Headers", "Content-Type");
//リクエストの結果をキャッシュ出来る時間を指定する
httpResponse.Headers.Append("Access-Control-Max-Age", "3600");
httpResponse.StatusCode = (int)HttpStatusCode.NoContent;
return;
}
}