JWTを生成/解析するときのsecret keyの生成方法
JWTについて調べてる。golangでちょっと使いたい用途があったので。
golang には JWT生成/解析するライブラリが結構あって、jwt-go
ってのが有名みたい。
func createTokenString(data *User, secretkey string) (string,error) { token := jwt.NewWithClaims(jwt.SigningMethodHS256, data) return token.SignedString([]byte(secretkey)) }
こんな感じでトークンが生成できるんだけど、secretkey
の部分に何を入れたらいいんだろう?ってなってた。
railsの例を見ると、configハッシュのsecret_key_baseキーに入っている値を渡してるみたい。 値はランダムな文字列のようだ。
それはどうやって生成されてるかっていうと、rake secret
みたいなコマンドを打つと生成できるようだ。でも、どういうアルゴリズムで生成されているかわからない。
とおもったら、以下に答えが。というかソースが。
んで、secure random golang とかで検索すると、まんまの答えがqiitaに上がってた。
ということで、これを使わせてもらって、めでたくセキュアにJWTのデータを生成・解析できるようになりました。
めでたし、めでたし。
heroku の golang で http から https へリダイレクト
お名前.comで取得した カスタムドメインを使ってhttps化しようと思ったけど、なんか難しかったので、カスタムドメインはあきらめた。んで、herokuapp.com のサブドメインでSSL化してhttps化完了とす。
でも、httpのほうもアクセスできちゃうので、そっちをどうにか閉じたい。herokuの機能としてhttpからhttpsへのリダイレクトはサポートされていないようなので、自前でリダイレクトしてあげないといけないっぽい。
Can Heroku force an application to use SSL/TLS? - Heroku Help
でも、↑のサンプルには go のサンプルがない... つらたん...
なので、色んなサイトを参考に以下のように作成。
func main() { var err error proto := os.Getenv("PROTO") if proto == "" { proto = "https" } engine := gin.New() engine.Use(func(c *gin.Context) { if proto != "https" { return } header := c.Request.Header isssl := false if params, ok := header["X-Forwarded-Proto"]; ok { if len(params) != 0 && params[0] == "https" { isssl = true } } if !isssl { req := c.Request loc := "https://" + req.Host + req.URL.Path if len(req.URL.RawQuery) > 0 { loc += "?" + req.URL.RawQuery } c.Redirect(http.StatusMovedPermanently, loc) } }) engine.Run(":" + port) }
抜粋なので、これだけではちゃんと動かない。 全体は こちら
ローカルでは http で動かしたかったので、環境変数にPROTO
があるかどうかで判別している。
herokuでは、httpsの場合だと、X-Forwarded-Proto
にhttps
が入ってくるらしいので、それをチェックして
https
じゃない場合はリダイレクトしている。
heroku にデプロイ時に goose up を動かす
Procfile に release: goose up
を足すだけ。
govendor と heroku
govendor は goパッケージをバージョン管理できるツール
プロジェクトのvendor以下をローカルパッケージとして管理できるgoの機能を拡張することで機能する。
govendor fetch <package name>
とすると、vendor/vendor.json
の下に管理用のjsonファイルが作成される。
heroku
もこのツールを対応している。
注意点としては、goのパッケージロードで、vendorディレクトリにパッケージがなければ、$GOPATH
以下を読みに行くので、ローカルではvendorディレクトリにパッケージがなく、$GOPATH
にはあってビルドが通るけど、heroku
上ではどちらにもなくてビルドがこける。ということがあるので、ちゃんと必要なパッケージはvendor.jsonに記述しておく必要がある。
OPC UA の ライブラリが githubに公開されていたので使ってみた
OPC UA Foundation が OPC UA のライブラリをgithubに公開していました。
OPC UA というのは、IoTのような組み込み系の分野でデータをやり取りすることを主な目的としたプロトコルです。WebSocketなんかが近いのかもしれませんが、もうちょっと分野に特化したプロトコルになっています。私も勉強中なので、詳しくはおいおいって感じです。
ここの回答にもあるように、SDKのドキュメントはさほど充実していません。サンプルプログラムや参照実装がいくつかあるので、それを元に手探りで作成していくのが基本スタイルのようです。
基本的にはgithubからクローンしてきて、Visual Studio でビルドすればサンプルは動きます。ただ、自分で作成したプログラムに組み込むとなると、どう動いているのかが理解できないと使えません。一番シンプルそうなサンプルがNetCoreConsoleClientそうだったので、これを動かしてみましょう。とはいえ、単純にREADMEに記載されている内容を動かすだけですが。
クライアントを動かすためには、サーバーが必要です。サーバーは適当なサンプルを動かしておきましょう。SampleApplications\Workshop\Reference\Server にあるサンプルプロジェクトが適当でいいと思います。ビルドして、動かしておきましょう。
サーバーが起動できたら、コンソールから dotnet run <サーバーのURL> を入力し、実行。サーバーの時刻がサブスクライブされて定期的に表示されます。
vimをwindows上で自前でビルド
色々調べてみたけど、結局はvimのリポジトリの説明が一番充実してるし最新かな?と思う。
大体のことは https://github.com/vim/vim/blob/master/src/INSTALLpc.txt に記載されてるので、それ見ればいいと思う。
TERMINALオプション付きでビルド
13項にTERMINALについての記載がある。MSVCだとうまくビルドできなかった。mingw32 を使ってビルドするとうまくいく。例で挙げられているのはgvim.exe 版なので、vim版を作りたいときは、2項のMinGWのセクションを見ながら、やるといい、例にも記載があるが、`mingw32-make -f Make-ming.mak GUI=no vim.exe` で作れる。これにターミナルを追加したければ、`TERMINAL=yes` をオプションに追加するだけだ。
ターミナルを追加し、できたexeを起動して、おもむろに `:terminal` としてもターミナルは起動しない。なぜなら、Windows では winpty.dll を内部で使っており、これがないと起動できないからだ。なので、http://vim-jp.org/vimdoc-ja/terminal.html#E946 の MS-WIndows の項目にもあるように、winptyを公式リポジトリから取得してきて、所定のパスに入れなければならない。今回はmigw32で作成しているので、msvc2015のzipの中にあるia32のwinpty.dllを使わせていただく。所定のファイルをビルドしたvim.exe と同じフォルダに置き、wintpy32.dll と名前を変える。これでターミナルが起動できる。
LUA オプション付きでビルド
基本的には、9項 Building with Lua support に記載の通りでいける。
ちょっとはまったのは、前のobjファイルや、vim.exe を削除してなくて、ビルドでこけてた。objファイルはobji686フォルダ以下にできたりしてるので、自分の環境ごとに削除しておくこと。
LUAオプションに指定するディレクトリ名はmingwの場合、'/'を使うか、'\'をエスケープする必要があるようだ。'\'をエスケープせずに指定すると、その文字をエスケープだと認識して、正確にパス指定ができなくなり、ビルド中にヘッダーファイルが見つけられずにこけてしまう。
PERL オプション付きでビルド
`LUA オプション付きでビルド` に記載した内容に気を付けていれば詰まることなくビルドできる。ちなみに、私はActivePerl 5.24 をインストールした。
Perlのインストール先に perlxyy.dll (xはメインバージョン、yyはサブバージョン) があるので、そのファイルをvim.exe のあるディレクトリにコピーしておくこと。
RUBY オプション付きでビルド
これも 気を付けるべきところは `LUA オプション付きでビルド付きでビルド` と同じ。
後は、64bit版RubyInstaller を使っているとちゃんとビルドできないので、32bit版をインストールしておくこと。使用したバージョンは2.3.3
msvcrt-ruby230.dll が無いと使えないので、vim.exe と同じディレクトリにコピーしておこう。
PYTHON3 オプション付きでビルド
ビルドオプションでつまるところはない。ダウンロードモジュールは本家から32bit用のインストーラーを取得すること。
上記サイトの Download Windows x86 executable installer を選択
ビルドコマンド
私の環境では以下のコマンドでビルドできた (PYTHON3のオプションのパスはPYTHON3のインストールパスに置き換えること。ビルドコマンドそのままだと動かないので注意)
$ mingw32-make -f Make_ming.mak GUI=yes TERMINAL=yes IME=yes MBYTE=yes ICONV=yes CSCOPE=yes NETBEANS=yes STATIC_STDCPLUS=yes DEBUG=no LUA=d:\\src\\lua53 DYNAMIC_LUA=yes LUA_VER=53 PERL=C:\\Perl DYNAMIC_PERL=yes PERL_VER=524 RUBY=C:/Ruby23 DYNAMIC_RUBY=yes RUBY_VER=23 RUBY_API_VER_LONG=2.3.0 PYTHON3=$LOCALAPPDATA/Programs/Python/Python36-32 DYNAMIC_PYTHON3=yes PYTHON3_VER=36 PYTHON=c:/msys64/mingw32 DYNAMIC_PYTHON=yes PYTHON_VER=27 PYTHON_HOME=c:/msys64/mingw32 PYTHONINC=-Ic:/msys64/mingw32/include/python2.7 DYNAMIC_PYTHON_DLL=libpython2.7.dll gvim.exe
追記:
最近ではここも詳しく載ってますね。ありがたい。
追記2 :
New PC 環境になったので、いくつかパスが変わった。あと、色々ダイエットした。
vim.exe
> make -f Make_ming.mak GUI=NO TERMINAL=yes IME=yes MBYTE=yes ICONV=yes CSCOPE=yes NETBEANS=yes STATIC_STDCPLUS=yes DEBUG=no LUA=c:/dev/lua51/src DYNAMIC_LUA=yes LUA_VER=51 PYTHON3=C:/Users/bamch/AppData/Local/Programs/Python/Python37-32 DYNAMIC_PYTHON3=yes PYTHON3_VER=37 vim.exe
gvim.exe
> make -f Make_ming.mak TERMINAL=yes IME=yes MBYTE=yes ICONV=yes CSCOPE=yes NETBEANS=yes STATIC_STDCPLUS=yes DEBUG=no LUA=c:/dev/lua51/src DYNAMIC_LUA=yes LUA_VER=51 PYTHON3=C:/Users/bamch/AppData/Local/Programs/Python/Python37-32 DYNAMIC_PYTHON3=yes PYTHON3_VER=37
loginsrv 試したみた
注:これは私的メモに近いものです。
loginsrv は JWTログイン認証をマイクロサービスとして提供できるようにするサーバー。ログイン認証の無いサービスにログイン認証を追加したり、SPAとかで重宝するのかもしれない。
以下の記事を参考にloginsrvを試してみた。私が以下に記述していることはここに全部書いてます。
わからなかったこと。
- goreman の起動の仕方
- gorem の使い方
- github認証でのログイン
- htpasswdでのログイン
goreman の起動の仕方
上記記事中にもある通り、goremanはforemanのクローン。複数のアプリを一括で起動できる(?)
なので、foremanと同じく、Procfileをカレントディレクトリに作成して、`goreman start`で起動するだけ。
ちょっとはまったのは、記事中の `web1: ./app` の部分。Windows だと `web1: app.exe` としないと起動できなかった。(go build の仕方によって回避できる問題なのかもしれない)
あと、Port を自動で環境変数PORTに設定してくれる。今回使っているサービスは使っていないようなので問題ないんだけど、環境変数を引数指定よりも優先して設定するようなアプリの場合は注意が必要かも?
gorem の使い方
上記記事中にもある通り、gorem は リバースプロキシサーバー。
config.json をカレントディレクトリにおいて、gorem で起動すればいいだけだった。簡単。
github認証でのログイン
自分のgithubページに行き、フェイスアイコンからSettingsを選択。Developer settings から OAuth applications を選択し、アプリを登録する。
私の場合は以下の情報を登録した
- Application name : loginsrc
- Homepage URL : https://github.com/tarent/loginsrv
- Authorization callback URL : http://localhost:5000/login
登録すると、Client ID と Client Secret が表示されるのでそれを loginsrv の引数として設定してあげる。
loginsrv -github client_id=xxx,client_secret=yyy
簡単。
htpasswd認証でのログイン
htpasswd には {user}:{MD5等でハッシュ化されたパスワード} という文字列が記述されたアカウントリストファイル(?)
以下のページでその情報を疑似的に作成。.htpasswd としてカレントディレクトリに保存。
そのファイル名をloginsrv の引数として渡してやると完成。
loginsrv -htpasswd file=.htpasswd
簡単。
まとめ
ログインを外部サービスに任さることができるのはだいぶうれしい。loginsrv が拡張されてtwitter やら facebook とかのアカウントでもログインできるようになったら面白いかもしれない。
goreman や gorem を使用すると、簡単に別々のウェブサービスが連結できて便利。今まではDocker-compose とかでやってたことが、数ファイルでカジュアルに実行できるので、そんなにでかいサービスを動かす必要がないのであれば使っていきたいなと思った。
以下に試した結果を上げておきます。