MENU

CORS対応の為にAPI Serverのヘッダーを共通化する

2年前から始めた個人開発を再開するこのシリーズ? 認証の為にSessionIDをCookieに保存する古き良き仕様なのですが、当面はこのまま進めてゆくゆくは今時の実装に変えていくことにします。
という訳で、ローカルでの開発環境をCORSに対応する為に2年前も色々と悪戦苦闘した記憶があるのだけど、現在の開発環境が以前のMacからLinuxに変わってしまったので、なるべくシンプルな方法を検討していたのですが、ローカルの環境自体をHTTPSにしてしまえばいいじゃないというなんともシンプルな方法を既に公開されている先人がいらっしゃいまして、こちらのお知恵をありがたくお借りすることと致しました。

詳細はこちら(ローカル開発環境の https 化)をご覧頂く方が考え方や運用法なども詳しく記述されていらっしゃるので、ぜひご覧ください。

無事にローカルの環境自体をHTTPS化が出来たので、次はAPI ServerであるGoから出力される HTTPヘッダーもCORS対応にして各APIエンドポイントから出力されるヘッダーの共通化を行います。

さて、いつもの様にGoのバージョンを最新のものに上げてから、ビルドをしてみます。うん。問題ないね。ホントーに安心の安定感にひとり頷きながら、新規機能を追加しようと新たなAPIエンドポイントを追加します。
便利なライブラリ等は喜んで使わせて頂く方ですが、WEBフレームワークの様な根本的な部分で今まで何度か選択ミスをしてきているので、極力使わないですむなら使いたくないと思っている様なワタクシの様な者にはGoの net/http は本当にありがたい標準ライブラリパッケージなのです。

と言う訳で以下がそのCORS対応の共通ヘッダー。

package controller

import (
	"net/http"
)

func SetHeadersMiddleware(next http.Handler) http.Handler {
	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
		w.Header().Set("Content-Type", "text/html")
		w.Header().Set("Access-Control-Allow-Origin", "https://localhost.curepa.com:3000")
		w.Header().Set("Access-Control-Allow-Credentials", "true")
		w.Header().Set("Access-Control-Allow-Methods", "GET,POST,PUT,PATCH,DELETE,HEAD,OPTIONS")
		w.Header().Set("Access-Control-Allow-Headers", "Content-Type, X-Requested-With, Origin, X-Csrftoken, Accept, Cookie")

		next.ServeHTTP(w, r)
	})
}

そして以下のコードで各APIエンドポイントをルーティングします。

package main

import (
	"server/app/controller"
	"log"
	"net/http"
)

func main() {
	// Handle static assets
	mux := http.NewServeMux()

	// Defined in route_auth.go
	mux.Handle("/api/users", controller.SetHeadersMiddleware(http.HandlerFunc(controller.APIUsers)))
	mux.Handle("/api/signup", controller.SetHeadersMiddleware(http.HandlerFunc(controller.APISignup)))
	mux.Handle("/api/login", controller.SetHeadersMiddleware(http.HandlerFunc(controller.APILogin)))
	mux.Handle("/api/inboxs", controller.SetHeadersMiddleware(http.HandlerFunc(controller.APIInboxs)))
	mux.Handle("/api/inboxs/all", controller.SetHeadersMiddleware(http.HandlerFunc(controller.APIInboxsAll)))
	mux.Handle("/api/deleteInboxs", controller.SetHeadersMiddleware(http.HandlerFunc(controller.APIDeleteInboxs)))
	mux.Handle("/api/tasks", controller.SetHeadersMiddleware(http.HandlerFunc(controller.APITasks)))
	mux.Handle("/api/tasks/all", controller.SetHeadersMiddleware(http.HandlerFunc(controller.APITasksAll)))
	mux.Handle("/api/tasks/search", controller.SetHeadersMiddleware(http.HandlerFunc(controller.APITasksSearch)))

以下省略

	// Sarting up the server
	server := &http.Server{
		Addr:    "localhost.hoge.com:8888",
		Handler: mux,
	}

	log.Println("My Service is started!")

	server.ListenAndServeTLS("tls/cert.pem", "tls/privkey.pem")
}

うん。無事にCookieも保存されました。とてもシンプル!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次