openapi-generator で生成した Go クライアントで Bearer 認証をする

備忘録。

openapi-generator で生成した Go クライアントで Bearer 使い方について。

以下の YAML を例に考える。Bearer ヘッダにつけて POST /action にリクエストする。

openapi: "3.0"
info:
  title: "Example API"
  version: "1.0.0"
paths:
  /foo:
    post:
      responses:
        '200':
          description: 'API with Bearer'
      security:
        # #/components/securitySchemes で定義した scheme を参照
        - bearerAuth: []
components:
  securitySchemes:
    bearerAuth:
      type: http
      scheme: bearer

クライアントを生成する

この YAML を元に生成するために、以下の config.json を用意する。

{
  "packageName": "myapi"
}
$ openapi-generator generate -i openapi.yml --git-user-id autopp --git-repo-id "myapi" -g go -o ~/go/src/github.com/autopp/go-myapp

クライアントにリクエストする

生成されたクライアントライブラリの func (*DefaultApi) PostFoo(ctx context.Context)POST: /foo へリクエストするためのメソッドになる。クエリパラメータやリクエストボディはメソッドの引数に渡すが、ヘッダは context.Context の key/value で渡すのポイント。

package main

import (
  "context"

  "github.com/autopp/go-myapp"
)

func main() {
  // クライアントインスタンスを生成
  cli := myapp.NewAPIClient()

  // Bearer トークンをセットした Context を作成
  bearer := "xxx"
  ctx := context.WithValue(context.Background(), myapp.ContextAccessToken, bearer)

  // POST: /foo にリクエスト
  res, err := cli.DefaultApi.PostFoo(ctx)

  // http.Response と error が返ってくる(レスポンスステータスが20xの場合、error は nil)
  fmt.Println(res)
  fmt.Println(err)
}