はじめに
UnityWebRequest で Google Cloud Functions の関数を実行する処理を作成したとき、エディタ上では正常に動作しましたが、WebGL にビルドしてブラウザで実行すると「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 の説明に関しては @att55 様の「なんとなく CORS がわかる…はもう終わりにする。」から引用させていただきます。
CORS は日本語訳すると オリジン間リソース共有 でした。つまり CORS とは、
なんとなく CORS がわかる…はもう終わりにする。あるオリジンで動いている Web アプリケーションに対して、別のオリジンのサーバーへのアクセスをオリジン間 HTTP リクエストによって許可できる仕組み
の事を言います。
対処法としては Google Cloud Functions の関数の HandleAsync() に以下のコードを追加するだけです。
(これは 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;
}
}
これでどのオリジンからでもその Google Cloud Functions の関数を実行することができるようになりました。