2022年3月9日水曜日

GAEのGo言語でuser APIが機能しない件

Goを使ってGAEのアプリケーションを作り始めたけど、管理画面を作る段階でいきなり行き詰まった。

user APIがあるんだけど、それがどうしても機能してくれなくて、LoginURLやLogoutURLが返ってこないんです。

検索して出てくるコードのまま書いてるんだけど、全然動いてくれないし、それ以上の情報が出てこない。

やむを得ず、Googleの有料サポートに申し込んで教えてもらった。

そのGCPの有料サポートが超絶素晴らしかったという内容はこちらの記事を読んでください。

どうしても動かなかったのは以下の部分。user APIを使う部分が全て返ってきてくれないんです。


import (
    ...
    "github.com/gorilla/mux"
    "google.golang.org/appengine/v2"
    "google.golang.org/appengine/v2/user"
    ...
)

func Entry(w http.ResponseWriter, r *http.Request) {
    ...
    ctx := appengine.NewContext(r)
    isadmin := user.IsAdmin(ctx)
    loginUrl, err := user.LoginURL(ctx, "/admin/top/")
    logoutUrl, err := user.LogoutURL(ctx, "/")
    ...
}

これを実行すると、エラーは出ないけど、isadmin、loginUrl、logoutUrlの全てが何も返ってこないんです。

同じ問題で悩んでいる人がいるかもしれないので、解決方法を書いておきますので、参考にして下さい。

結論から言うと、問題が発生してたのは、github.com/gorilla/muxです。

これをインポートして、使う場合は最後に1行追加しなければならないんです。

ゴリラマックス(Gorillamux)を使う場合、URLマッピングの部分を以下のように書きます。


import (
    ...
    "github.com/gorilla/mux"
    "net/http"
    ...
)

func main() {
    r := mux.NewRouter()
    r.HandleFunc("/", indexHandler)
    r.HandleFunc("/admin/", admin.Entry)
    http.Handle("/", r)
}

ポイントは、順番にURLマッピングをして、最後にhttp.Handle("/", r)というのを1行書いて、登録してやらないといけないんです。

この1行が抜けてから、何度やってもできなかったんですね。

ということで無事に解決できました。

ちなみにGorillamuxを使わない場合は、このように書きますよね。


import (
    ...
    "github.com/gorilla/mux"
    "net/http"
    ...
)

func main() {
    http.HandleFunc("/", indexHandler)
    http.HandleFunc("/admin/", Entry)
}

こうやって書いた場合には、簡単ですが、Gorillamuxを使わないと複雑なURLマッピングができないので、ゴリラを使っている人は参考にしてください。

ゴリラを使う場合には少し書き方が変わるので注意が必要です。

何か質問があれば、お気軽にコメント下さい。

0 件のコメント:

コメントを投稿

GAEのGo言語でuser APIが機能しない件

Goを使ってGAEのアプリケーションを作り始めたけど、管理画面を作る段階でいきなり行き詰まった。 user APIがあるんだけど、それがどうしても機能してくれなくて、LoginURLやLogoutURLが返ってこないんです。 検索して出てくるコードのまま書いてるんだけど、全...