Go Langで作成したAPIをSwagger UIで表示する

タイトルにあるようにSwaggerで作成したいのであれば、yamlを作成すればいい。 だけど、そんなことをするのは面倒くさい。 というのもNestJsではデコレーターを追加するだけで自動でSwagger UIを作成してくれた。 そこでGoでも同様な手順で実現できるライブラリを探してみた。 swaggo/swag swaggo/swagを使えばできそうだったので試してみた。 インストール go install github.com/swaggo/swag/cmd/swag@latest アノテーションを作成する main.goにアノテーションを追加する。 // @title sample api // @version 1.0 // @description this is sample apigw // @host localhost:18080 // @BasePath /api/v1 // @tag.name accounts // @tag.description about accounts request func main() { handlers.HandleRequests() } 記入後にswag initを実行する。 . ├── docs.go ├── swagger.json └── swagger.yaml すると上記ファイルたちが生成される。 UIで確認する これがいまいちわかなかったので、https://editor.swagger.io/に生成されたyamlファイルをコピペして見る方法にしているけど、localhost:18080/api/v1で見られるんだと思われる。 …見れないので、要調査。 ⚠️ 違った。 localhost:18080/api/v1 上のURLはBaseURLだった。 まあ、問題ないので、いったん上記方法で行く。 追記:2023.12.30 Swagger ViewerVSCodeの拡張機能があった。 個別APIのアノテーションを作成する // GetAccount // @summary アカウントの情報を返します // @description user_idを元にアカウント情報を返します // @tags accounts // @produce json // @success 200 // @failure 401 // @router /accounts [get] func FetchUserById(w http....

投稿日 · 2023-12-28 · 更新日 · 2024-06-07 · 1 分 · nove-b

Go Langで作成したログイン認証のjwtのアクセストークンが切れた時にどうするか

アクセストークンの有効期限は短く ログイン認証を作るうえで、アクセストークンの有効期限は短い方がいい、という情報を得た。 アクセストークンが盗まれた時に、備えてのことらしい。 例えば15分とか、って例で書かれていた。 そうすると15分ごとにログインをし直させなければならない。 それはユーザビリティ的にどうなのだろうか。という疑問が生まれた。 それを解決するのがリフレッシュトークンらしい。 アクセストークンとリフレッシュトークン リフレッシュトークンはアクセストークンを再発行するために必要になる。 例えば、ログインをしアクセストークンを取得する。 15分後、アクセストークンが切れた場合はリフレッシュトークンを使用し、アクセストークンを再発行する。 その際、リフレッシュトークンも最新化する。 これで15分ごとにユーザーがログインし直すという苦痛から解放することができる。 アクセストークンは危険で、リフレッシュトークンは安全なの? アクセストークンもリフレッシュトークンも一緒に得ることができ、同じように保存をしておく必要がある。 それなのにどうしてアクセストークンは危険で、リフレッシュトークンは安全なのだろうか。 ってずっと疑問だったけど、社内の博士に聞き解決した。 確率の問題 アクセストークン、リフレッシュトークンが盗まれるのは通信中である。 通信にアクセストークンを持たせて、15分間、何回通信をするだろうか。 それに比べてリフレッシュトークンはアクセストークンが失われた時にしか使用されないので、リフレッシュトークンに比べて安全だと言える。 ということ。

投稿日 · 2023-12-22 · 更新日 · 2024-06-07 · 1 分 · nove-b

Go Langで新規登録のWebAPIを作成したので、認証周りをJWTで作成する。

期待するもの 新規登録のAPIを作成したので、次はログイン機能を作成したい。 ログインは、メールアドレスとパスワードを送り一致したら、tokenを取得する。 で、tokenを使って認証付きのAPIを叩けるようになりたい。 tokenにはjwtを使用する。 jwtってなに? これはどこかで調べてまとめる(気が向いた時)。 JWT認証を作成する パッケージのインストール github.com/dgrijalva/jwt-goパッケージの情報が多かったので、それに従うことにする。長い物には巻かれるべきで間違いない。 go get github.com/dgrijalva/jwt-go パッケージをインストールする。 Tokenを生成する まずjwt.goというファイルを作成する。 今回はauthフォルダの中に作成した。 それでは書いていく。 まずは、jwtを生成するためのシークレットキーを作成する。 var jwtKey = []byte("your_secret_key") ここでは任意の文字列(今回は"your_secret_key")をバイト列に変換し、jwtKeyに代入している。 バイト列というのがピンとこないので、 fmt.Printlnで書き出しみると、[121 111 117 114 95 115 101 99 114 101 116 95 107 101 121]となった。なんとなく理解した。 このようにして文字列をバイト列に変換することは、多くの場面でデータの操作や処理に利用されます。JWTの署名などのセキュリティ関連の操作では、シークレットキーをバイト列として扱うことが一般的です。 とのことでした。 次に、JWTのクレームを表す構造体であるClaimsを定義する。 これは任意のJSONデータっていう意味っぽい。 type Claims struct { Name string `json:"name"` jwt.StandardClaims } 今回はnameを含めることにする。 と思ったけど、ユニークで必要がありそうなので、ユーザーIDにした。 下記のように変更する。 type Claims struct { UserID uint `json:"user_id"` jwt.StandardClaims } 次に、Tokenを作成する関数を作成する。 コードの詳細はコメントアウトに書いた。 func generateToken(userId uint) (string, error) { // トークンの有効期限を設定(この場合は15分) expirationTime := time....

投稿日 · 2023-12-20 · 更新日 · 2024-06-07 · 2 分 · nove-b

Go Langで新規登録と退会のWebAPIを作成したので、やったことをまとめてみる。

いたるまで Go Lang で WebAPI を作成するために、まずは Docker で MySQL を構築する Go Lang で WebAPI を作成するために、Golang で MySQL に接続する Go Lang で WebAPI を作成するために、Golang でサーバーを立ち上げる Go Lang で WebAPI を作成するために、Golang でエンドポイントにアクセスし DB からデータを取得する Go Lang で WebAPI を作成するために、Golang で DB のデータを取得する main ファイルをそれぞれの責務に分割する ディレクトリ構成 . ├── db ├── db.go ├── handlers │ ├── auth │ │ ├── delete_user_handler.go │ │ └── create_user_handler.go │ └── handlers.go ├── models │ └── user_model.go └── main....

投稿日 · 2023-12-14 · 更新日 · 2024-06-07 · 4 分 · nove-b

Go LangでWebAPIを作成するために、GolangでエンドポイントにアクセスしDBからデータを取得する

Go LangでWebAPIを作成するために、GolangでMySQLに接続する Go LangでWebAPIを作成するために、Golangでサーバーを立ち上げる でDBと接続することはできたし、サーバーを立ち上げることに成功した。 User情報を取得するAPIを作成する 次は、特定のエンドポイントにアクセスした際に、DBからデータを取得する。 具体的にはhttp://localhost:8081/usrsにアクセスした際にusersテーブルのデータを取得できるようにしたい。 エンドポイントを作成する まずはhttp://localhost:8081/usrsのエンドポイントを作成する。 func sample(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Welcome to the sample!") fmt.Println("Endpoint Hit: sample") } func handleRequests() { http.HandleFunc("/sample", sample) log.Fatal(http.ListenAndServe(":8081", nil)) } handleRequestsをmain関数の中で実行すればhttp://localhost:8081/usrsにアクセスした際に Welcome to the sample と表示されるようになった。 ちになみに、 fmt.Fprintf(w, "Welcome to the sample!") 上記のwが謎で調べてみたところ、 w を使用して Write メソッドを呼び出すことで、HTTPレスポンスの本文をクライアントに送信することができます。fmt.Fprintf(w, “Welcome to the sample!”) は、fmt.Fprintf 関数を使用してフォーマットされた文字列を w.Write を介してクライアントに送信しています。 とのことだった。 いまいち理解しかねるけれど、なんとなく必要なことは分かった。 DBのデータをフェッチする 次にhttp://localhost:8081/usrsにアクセスした際にDBの値を返すようにしてみる。 まずはDBに接続する関数を作成する。 これは前回も作成した。 func dbInit() *gorm.DB { dsn := "root:password@tcp(127....

投稿日 · 2023-12-04 · 更新日 · 2024-06-07 · 2 分 · nove-b