Carpe Diem

備忘録

OAuth 2.0 Device Authorization Grant

概要

サービスのマルチデバイス対応をした際に、各デバイスで同じアカウントにログインするのはユーザにとっては非常に手間です。

例えばテレビデバイスに対応した場合にID&パスワードをリモコンで入力させるのはユーザにとって苦痛でしかありません。

なのでサービス側はユーザが苦労なくスムーズにログインできる方法を提供しなくてはいけませんが、一方でセキュリティについても気にする必要があります。

そんなケースの対応方法としてOAuth 2.0 Device Authorization Grantがあるので紹介します。

ユーザの体験

例としてテレビデバイスでログインします。
huluが体験として分かりやすいので実際にやってみます。

ログインしようとする

f:id:quoll00:20210201045708j:plain

続きを読む

SquidをForward Proxyサーバとして使う

概要

Forward Proxyを導入することで以下のメリットを得ることができます。

  • DNS lookupをキャッシュして名前解決を高速化
  • Targetからのレスポンスをキャッシュして高速化
  • TargetがIP制限している場合に、送信元IPを固定するサーバにする
  • ↑と逆にTargetの制限をかけられる(社内→インターネットのパターン)

今回Forward Proxyとして有名なSquidを使って簡単な検証を行ってみます。

環境

続きを読む

http clientでHTTP/2を使う方法

背景

外部APIを叩く時に利用するhttp clientですが、サーバ側がHTTP/2対応しているのであればコネクションの有効活用ができるようHTTP/2を使いたいものです。

その際にhttp client側で設定する点、気をつける点を説明していきます。

環境

  • Go 1.15.6
  • curl 7.64.1

HTTP/2対応しているか確認する方法

まずは対象とするサーバやhttp clientがHTTP/2対応になっているかを確認する方法を紹介します。

サーバ側の確認

サーバ側が対応しているかどうかはcurl-vオプションで手軽に確認できます。

続きを読む

WARNING: Missing 'go_package' option が出る時の対処法

背景

いつの間にかprotocでprotoc-gen-goプラグインを使うと以下のようなエラーが出るようになりました。

2021/01/05 06:19:01 WARNING: Missing 'go_package' option in "xxx/xxx.proto",
please specify it with the full Go package path as
a future release of protoc-gen-go will require this be specified.
See https://developers.google.com/protocol-buffers/docs/reference/go-generated#package for more information.

現時点ではwarningですが、メッセージにあるように将来的にrequiredになるようなので早めに対応する方が良さそうです。

ドキュメントでも以下のようにgo_packageにフルパスのimportを指定するように書かれています。

The .proto file should contain a go_package option specifying the full import path of the Go package that contains the generated code.

ref: Go Generated Code  |  Protocol Buffers  |  Google Developers

続きを読む

ポインタを図で理解する

概要

Goのポインタを図で理解することで

がどういうことかを理解でき、参照渡しの時に

x = y

だと更新されず

*x = *y

だと更新される理由が分かります。

続きを読む

structのメモリ割り当て

概要

Goにおけるstructのメモリ構造を知ることでフィールド順序に対する意識が変わったり、なぜunsafe.Sizeof(string)16bytesunsafe.Sizeof(slice)24bytesになるかが理解できます。

環境

各型のメモリ割り当て

unsafe.Sizeof()を使うとその変数がどれくらいメモリを割り振るかが分かります。
※変数の分確保するメモリであり、参照先のメモリは含みません

unsafe.Sizeof()
bool 1
int32 4
int 8
float64 8
string 16
[]T 24

The Go Playground

structのフィールドにそれぞれの型を付けると、その分メモリが割り振られます

続きを読む

GoでShutdown Hook

背景

以前Graceful shutdown機能の使い方を紹介しました。

christina04.hatenablog.com

これによって処理途中のリクエストが残っていても、きちんと完了するまで待ってからプロセスを終了してくれます。

しかしPubSubのPublish()のような非同期処理であればリクエストが完了しても内部でキューが残っており、単純にそのまま終了するとメッセージがロストしてしまいます。なのでプロセス終了までにStop()を呼び出す必要があります。
またミドルウェアとのコネクションクローズといった後処理も、SDKにメソッドが用意されているのであればプロセス終了までに呼び出すべきです。

このようなプロセスが終了するまでのやっておきたい後処理を、あらかじめ登録しておき最後にまとめて呼び出す仕組みをShutdown Hookと呼びます。

JavaではRuntimeに用意されていますが、goでは用意されていないので自前で実装する必要があります。

続きを読む