技術検証方法・思考について
Published on October 19, 2024
Category: エンジニア思考
背景
GmailAPIを用いた実装が必要になり、Laravelの実装で連携のために必要な認証情報をどのような形で読み込ませるか、議論になりました。
実際にGmailAPIは連携情報をJsonファイルに情報を格納されている状態です。
Jsonファイルをローカルサーバーに格納して認証情報を取得するという形も取れますが、個人的な考えではあまりセキュリティの観点から望ましくないと考えます。
対応としては、環境変数に設定して、認証情報を利用するというのが一般的ではないでしょうか?
所属する企業で上記の検証を行う際、同僚とペアプロを行い検証を行いました。
その時に、同僚の調査方法が学びになったのでメモとして残しておこうと考えました。
実際にはネット検索すれば必要な情報は出てくると思いますが、答えが載っているからいいや、というわけではなく、調査のプロセスを学ぶことがエンジニアリングにとって非常に大事なものだと考えております。
目的
エンジニアとしての問題解決力をつけるため思考方法を認識するためです。
前提
- GnailAPIの認証情報はJsonファイルでGCPから取得が可能
- ファイルを読み込むことで基本的にAPIとの連携が可能
- Jsonファイルで認証情報を読み込むのではなく環境変数で読み込ませたい
- 開発環境
- Laravel
- Docker
- PHP
考え方
実際にすぐにコードを実装しようとするのがエンジニアの性です。
眼に見える範囲のものに着手しても根本が誤っている場合、全て時間の無駄と考えています。
私自身、目的の理解、前提のロックしていく作業がとても苦手なので最近は下記の内容を強く意識して開発に臨んでいます。
開発を行なっていく中、まだまだ未熟なので下記を意識しても取りこぼしだったりはあります。
ただ、これに関しれは習慣化して、より考え方を深くしていくためには、失敗をして学ぶ必要があると考えております。
- 解決したい課題を明確にする。
- 何を行いたいか、認識をまずはすり合わせを行う必要があります。
- ここの認識に誤りがあると後続のアプローチの検討・検証のための実装が意味をなしません。
- 時間がかかっても良いです、必ずここの認識を擦り合わせてください。
- 課題に対するアプローチの検討。
- 現状で考えられるアプローチ方法を自身でまずは探してみる。
- 開発チーム内で検討しているアプローチ方法を共有して、アプローチの方向性など誤りがないか確認する。
- 問題なければ検証に移行していく。
- 実際に実装できるか検証する
- 検証詳細を参照してください。
検証詳細
- 検証1
- 内容
- どのようにJsonファイルから認証情報を取得して連携されているのか確認する
- 作業内容
- GmaiAPIとプロジェクトを連携するライブラリをインストール
- GmaiAPI連携のメソッドを作成して連携できることを確かめる。
- 下記が連携のため、JsonファイルでAPI連携のための認証情報を読み込んだ実装となります。
private function getGoogleClient() { $client = new Client(); $credentialsPath = storage_path('app/gmail/service-account.json'); $client->setAuthConfig($credentialsPath); $client->addScope(Gmail::GMAIL_READONLY); $client->setApplicationName('テスト'); $client->setSubject(env('GOOGLE_USER_EMAIL')); return $client; }
- 下記が連携のため、JsonファイルでAPI連携のための認証情報を読み込んだ実装となります。
- 認証情報を読み込むためのメソッドを調査する
- 結論
- 認証で使用される情報は下記であった。
- 内容
- 検証2
- 内容環境変数を介して、読み込めるように実装できるか調査する
- 作業内容
- GmailAPIから提供されているメソッドでJson形式以外に、認証情報読み込む方法がないかメソッドを調査
setAuthConfig
- 内部を確認すると引数のconfig['認証情報のkey']に対して必要な情報をが渡されている
public function setAuthConfig($config) { if (is_string($config)) { if (!file_exists($config)) { throw new InvalidArgumentException(sprintf('file "%s" does not exist', $config)); } $json = file_get_contents($config); if (!$config = json_decode($json, true)) { throw new LogicException('invalid json for auth config'); } } $key = isset($config['installed']) ? 'installed' : 'web'; if (isset($config['type']) && $config['type'] == 'service_account') { // @TODO(v3): Remove this, as it isn't accurate. ADC applies only to determining // credentials based on the user's environment. $this->useApplicationDefaultCredentials(); // set the information from the config $this->setClientId($config['client_id']); $this->config['client_email'] = $config['client_email']; $this->config['signing_key'] = $config['private_key']; $this->config['signing_algorithm'] = 'HS256'; } elseif (isset($config[$key])) { // old-style $this->setClientId($config[$key]['client_id']); $this->setClientSecret($config[$key]['client_secret']); if (isset($config[$key]['redirect_uris'])) { $this->setRedirectUri($config[$key]['redirect_uris'][0]); } } else { // new-style $this->setClientId($config['client_id']); $this->setClientSecret($config['client_secret']); if (isset($config['redirect_uris'])) { $this->setRedirectUri($config['redirect_uris'][0]); } } }
- 上記の形式ということは下記のような形でsetAuthConfigに認証情報を渡せそう
- GmailAPIから提供されているメソッドでJson形式以外に、認証情報読み込む方法がないかメソッドを調査
$client->setAuthConfig([ 'type' => 'type', 'client_email' => 'アドレス', 'private_key' => 'key', 'client_id' => 'id', ]);
- 作業内容
- 内容環境変数を介して、読み込めるように実装できるか調査する
- 結論
- 作業内容3の実装でsetAuthConfigに渡ってきているかログで確認したところ渡せた。
まとめ
検証2でJsonファイル形式を用いなくても、setAuthConfigの引数に認証情報に渡せることがわかったため、下記のように実装することで環境変数に認証情報を設定することで連携することができた。
# Google API
GOOGLE_CLIENT_ID={GmailAPIから取得したJsonファイル内に記載のある情報を設定してください}
GOOGLE_CLIENT_EMAIL={GmailAPIから取得したJsonファイル内に記載のある情報を設定してください}
GOOGLE_CLIENT_PRIVATE_KEY={GmailAPIから取得したJsonファイル内に記載のある情報を設定してください}
GOOGLE_USER_EMAIL={GmailAPIを介して連携したいGmailアドレス}
private function getGoogleClient()
{
$client = new Client();
$client->setApplicationName('テスト');
$client->addScope(Gmail::GMAIL_READONLY);
$client->setSubject(env('GOOGLE_USER_EMAIL'));
$client->setAuthConfig([
'type' => 'service_account',
'client_email' => env('GOOGLE_CLIENT_EMAIL'),
'private_key' => env('GOOGLE_CLIENT_PRIVATE_KEY'),
'client_id' => env('GOOGLE_CLIENT_ID'),
]);
return $client;
}
コメント
このように調査・検証の考え方については、開発を行う上で、とても重要なものだと感じました。
どのような言語やフレームワークを使うにしても、根本の考え方を理解しないといけないと考えます。
この思考方法を身につけ、強化していくことで使用言語が変わろうとも、根本の考え方を理解していれば使用言語などに振り回されずに済むと感じました。
まだ、未熟者ではあるため、上記の私自身の持論に対して色々な見解があると思いますが、引き続き理解を深めていけるように精進していきます。