Local by FlywheelはWordPress開発環境の新定番として日本でも人気が出つつあるソフトである。先日のポッドキャストでコントリビューターデイの話題になったとき、Localについて触れたのだが、そこで話した「LocalってJWTとかでコケることあるよね」という話に反応があったので、個別のチップスとして切り出して紹介する。
LocalのサイトでJWTやOAuthが失敗する場合
JWT(ジョット)とはJSON Web Tokenの略であり、APIアクセスする際の管理者権限の証明としてよく使われる。典型的な利用方法としては、GCPやAWSなどのサービスを利用する際に利用する。
詳細は省くが、こうした認証においては、リクエストの有効期限を確かめるためにタイムスタンプが利用されている。「このリクエストの認証の有効期限は5分以内」といった類のチェック機構である。
ところがLocalのDockerコンテナは非常に薄い設定となっており、たとえばVimも入っていないし、ユーザーもrootログインしかできない。さらに、ntpdというサーバーの時刻合わせを行うツールも入っていない。すると、OSのスリープなどを繰り返しているうちに、この時間が少しずつずれていき、いつしかJWTやOAuthで定められた規定のタイムリミットをオーバーするようになってしまう。その結果、どんなリクエストを発行してもエラーとなってしまう。
これは想定外の挙動であるため、原因を特定するためにものすごくハマる。
解決方法
解決方法は単純で、Localのすべてのコンテナを停止し、Localアプリ自体を再起動すること。これにより、時計が元に戻る。
筆者はLocalのフォーラムに要望を出しているが、採用されるかどうかは不明。
ハマるパターン
多くはクラウドサービスなどへのアクセス制御である。
- WordPressでAWSのS3やCloudFrontなどで署名つきURLを利用してる場合
- GCPのCloud EndpointsにJWTで署名してアクセスしようとしている場合
- SNSログインなどでOAuthを利用している場合
こうした機能を作る人はあまり多くないと思うが、「ローカル環境でだけ動かない」という場合はタイムスタンプを疑ってみるのもよいだろう。
おまけ
Capital Pではタレコミから書いてほしい記事の内容なども募集している。最近、筆者はWordPressの何がわからないのかがわからなくなってしまってきているので、お気軽にリクエストをいただきたい。お役立ちコンテンツを世に発信して、筆者の無能感を解消する手助けをして欲しい。
申し訳ございません、このリンクは現在利用できないようです。のちほどお試しください。
コメントを残す