【C#/Unity/GCP】WebGL で Google Cloud Functions の関数を使用できない時の対処法

C#

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 とは、あるオリジンで動いている Web アプリケーションに対して、別のオリジンのサーバーへのアクセスをオリジン間 HTTP リクエストによって許可できる仕組みの事を言います。

なんとなく CORS がわかる…はもう終わりにする。

対処法

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;
    }
}

その他

参考記事

お問い合わせ

    タイトルとURLをコピーしました