LoginSignup
3
1

More than 5 years have passed since last update.

CrystalとOAuth認証

Last updated at Posted at 2017-12-24

RubyでTwitterやFacebookのIDを使ってOAuth認証を行う場合、大体omniauthを使うかと思いますが、Crystalの場合はどうするかというと、multi_authというツールがあります。

基本的な使い方はREADMEを見たらそのまんまなので、特に苦労することはないですが、環境構築でちょっと手間取ったところがあったので手順の再確認ということで以下に纏めます。
尚今回はTwitterで認証してみます。必要なクレデンシャルは以下のサイトで登録しておきます。

CrystakとKemalのバージョン

CrystalとKemalのバージョンは以下の対応で確認しています。

  • Crystal
    • 0.23.1
  • Kemal
    • 0.20.0

仕様の破壊的変更の影響があるので、現時点では上記の組み合わせ以外は動きません。

必要なもの

取り敢えずshard.ymlは以下の感じです。

dependencies:
  kemal:
    github: kemalcr/kemal
    version: 0.20.0
  kemal-session:
    github: kemalcr/kemal-session
  db:
    github: crystal-lang/crystal-db
  pg:
    github: will/crystal-pg
  multi_auth:
    github: msa7/multi_auth

kemal-sessionとdb、pgは取得した情報を保存するのに使ってます。
取り敢えず最低限動かすのに必要なコードの抜粋をすると以下の通りです。

require "kemal"
require "multi_auth"

MultiAuth.config("twitter", ENV["TWITTER_CONSUMER_KEY"], ENV["TWITTER_CONSUMER_SECRET"])

def self.multi_auth(env)
  provider = env.params.url["provider"]
  redirect_uri = "#{Kemal.config.scheme}://#{env.request.host_with_port.as(String)}/multi_auth/#{provider}/callback"
  MultiAuth.make(provider, redirect_uri)
end

get "/multi_auth/:provider" do |env|
  url = multi_auth(env)
  env.redirect(url.authorize_uri)
end

get "/multi_auth/:provider/callback" do |env|
  user = multi_auth(env).user(env.params.query)
  env.redirect "/user" # 認証後に遷移するURL
end

https://apps.twitter.com

で取得した情報の内必要なものは、Consumer Key (API Key)とConsumer Secret (API Secret)になります。
第2引数と、第3引数に設定します。

ログインしたいページに以下のリンクを貼り、画面からクリックで認証が走ります。
<a href="/multi_auth/twitter">Sign in with Twitetr</a>

特に難しいことはないですが、twitterから取得できる情報として

  • nickname(twitter id)
  • uid
  • image_url(iconのURL)

などがあります。

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1