spring of life

技術、ときどき日常のブログ(予定)

認証機能を作った時のあれこれ

クライアントアプリの認証機能を作ったんだけど、その時に調べたことをまとめる!

アプリが認証とは、だけど、

  1. サーバ側のアプリにあらかじめIDとキーを発行してもらう
  2. 発行してもらったIDとキーをAuthorizationヘッダに付けてリクエストを送る

ぐらいの簡単なものを作った

SecureRandom
id = SecureRandom.hex(8)
...
key = SecureRandom.hex(16)
Rake タスク
  • アプリのIDとキーをRakeタスクで簡単に発行できるようにした
  • lib/tasksの下に.rakeと最後に付けてファイルを作っておけば自動的に読み込まれるらしい
  • 後で調べて気づいたんだけど、 rails g task xxxでファイルが生成されるらしい
# lib/tasks/client.rake

namespace :client do
  desc 'Create application'
  task :create => :environment do
    id = Client.generate_application_id
    key = Client.generate_application_key
    begin
      Client.create!(:application_id => id, :application_key => key)
      puts "Application id: #{id}"
      puts "Application key: #{key}"
    rescue StandardError => e
      p e
    end
  end
end
  • app/modelsの下で定義したクラスを使うには:environmentを付けないとエラーになる
$ bundle exec rake client:create
rake aborted!
NameError: uninitialized constant Client
...
  • :environmentが何しているかはこちら
    • :createの前に:environmentタスクを実行してロードする感じだね
Rake タスク(引数付き)
  • この後、引数でIDを指定して削除するタスクも作ってみた
desc 'Destroy application'
task :destroy, [:application_id] => :environment do |task, args|
  begin
    Client.find_by(:application_id => args.application_id).destroy
    puts "Destroy #{args.application_id}"
  rescue StandardError => e
    p e
  end
end
  • 引数を指定する場合のコマンド
$ bundle exec rake client:destroy[hoge]
  • だけど、これだと[, ]が原因でエラーが出るので、タスクをクォーテーションで囲むかエスケープする
$ bundle exec rake 'client:destroy[hoge]'

or

$ bundle exec rake client:destroy\[hoge\]

ちょっと気持ち悪いな。。。環境変数で指定する方法とかあるみたいだけど、どれがいいんだろうか(´・_・`)