おかりなの記事

プログラミング学習の記録です。

APIの認証情報が読み込めてなかった

今更ながら,はてブではマークダウン記法でブログの内容を記述することに気付きました。
これから気をつけます!
作っているブログですが、残りはブログ記事の表示をさせるところまでできました。
はてなAPIを叩くべく、調べながら実装していってるところです。
今日あったことをまとめておこうと思います。

使用技術

はてなブログAPIの認証情報を入れる

.envファイルに以下を記述する。

HATENA_USERNAME=自分のユーザー名
HATENA_BLOG_ID=ブログID
HATENA_API_KEY=APIキー

このとき、間にスペースをいれたり、シングルクォーテーションは入れないことに注意する。

はてなブログAPIのServiceクラスを書く

ここの中身についての詳細は、きちんと実装できてから書きます!
とりあえず、こんな感じで書いていました。

class HatenaBlogService
  BASE_URL = "https://blog.hatena.ne.jp"
  
  def initialize
    @username = ENV['HATENA_USERNAME']
    @blog_id = ENV['HATENA_BLOG_ID']
    @api_key = ENV['HATENA_API_KEY']
  end

~~~

問題発生! コンソールでの確認

$ rails consoleで、きちんと読み込めているか確認。

new-blog(dev)> service = HatenaBlogService.new
=> #<HatenaBlogService:1234123412341234 @api_key=nil, @blog_id=nil, @username=nil>

値が nil になっていました。

続いて、Dockerでのコンテナでの確認。

$ docker compose exec web bash

echo $HATENA_USERNAME

echo $HATENA_BLOG_ID

echo $HATENA_API_KEY

そもそもサービスクラスが渡っていなかったようです。

原因は Gemfile と compose.yml

調べていくと、

  • gem 'dotenv-rails'が入っていなかった
  • compose.ymlにて環境変数管理ができていないこと こと

上記2点が原因でした。

compose.ymlにて環境変数管理

compose.ymlにて以下を追記。

services:
  web:
    build: .
    ports:
      - "3000:3000"
    # 追記は以下
    env_file:
      - .env

または

services:
  web:
    build: .
    ports:
      - "3000:3000"
    environment:
      - HATENA_USERNAME=${HATENA_USERNAME}
      - HATENA_BLOG_ID=${HATENA_BLOG_ID}
      - HATENA_API_KEY=${HATENA_API_KEY}

ここで、認証情報を直接書かないことに注意です。

gem 'dotenv-rails'をいれる

Gemfileに 追記。

gem 'dotenv-rails', groups: [:development, :test]

dotenv-railsにて、アプリ直下の.envファイルが自動的に読み込まれるようになります。

これで設定が終わりました。
Dockerの再設定をして、再度確認しましょう。
これで読み込まれるようになっているはずです。

まとめ

以下の流れで認証情報が読み込めるようになりました。

  1. .envファイル作成
  2. compose.ymlでenv_file指定
  3. コンテナ再起動で設定反映
  4. 動作確認

認証情報が見られちゃうと、最悪ブログ消されてしまうので注意して実装していきましょう!
誰かの役に立てると幸いです。