2018年12月7日
プログラミング
sorceryで実装するLINEログイン
はじめに
新しい技術にチャレンジし続けるeishisのアドベントカレンダーDay7です!
昨日はキーボードで画面が隠れる場合の対処法(React Native)についての記事でした。
今日は gem sorcery にモンキーパッチを当ててLINEログインを実装した方法をお伝えします!
今回使用する環境
- Ruby: 2.5.0
- Ruby on Rails: 5.2.1
- sorcery: 0.12.0(インストールまで終わっている状態)
- LINEログイン: 2.1
devise? sorcery?
認証系の gem でよく使われる devise と sorcery の違いをまとめてみました。
deviseの特徴
コマンド1つでviewまで作成してくれる!
gem omniauth-line を併用すればLINEログインにも対応!
カスタマイズしようとするとつらい…
sorceryの特徴
便利なメソッドを提供してくれるイメージ
カスタマイズしやすい
LINEログインには不対応(facebook, twitterなどは対応)
どちらを使う?
devise は view まで用意してくれとても便利です。しかし、実際にRailsアプリを開発しているとそのままで使える事なく、ほぼカスタマイズ必須。以前 devise のカスタマイズでつらい思いをした事もあり、個人的には sorcery が好きです。
でもLINEログインに対応していない!
ということで、 sorcery にモンキーパッチを当ててLINEログインを実装することにしました。
モンキーパッチを当てる
ファイルの置き場所などはこちらを参考にしました。
クックパッド開発者ブログ:Ruby on Rails アプリケーションにおけるモンキーパッチの当て方
また、sorcery を LINEログイン に対応させるためのPRがあります(2018.11現在マージされておらず…)
モンキーパッチの内容についてはこちらのPRを基に、LINEログインのバージョンアップに伴い仕様が変更していた部分を修正しました。
sorcery / Support the LINE login auth(PR)
下準備
初期化時に lib/monkey_patches 以下を読み込むように
config/initializers/000_monkey_patches.rb
Dir[Rails.root.join('lib/monkey_patches/**/*.rb')].sort.each do |file|
require file
end
モンキーパッチ
lib/monkey_patches/sorcery_ext.rb
module Sorcery
module Controller
module Submodules
# This submodule helps you login users from external auth providers such as Twitter.
# This is the controller part which handles the http requests and tokens passed between the app and the @provider.
module External
def self.included(base)
base.send(:include, InstanceMethods)
require 'sorcery/providers/base'
require 'sorcery/providers/facebook'
require 'sorcery/providers/twitter'
require 'sorcery/providers/vk'
require 'sorcery/providers/linkedin'
require 'sorcery/providers/liveid'
require 'sorcery/providers/xing'
require 'sorcery/providers/github'
require 'sorcery/providers/heroku'
require 'sorcery/providers/google'
require 'sorcery/providers/jira'
require 'sorcery/providers/salesforce'
require 'sorcery/providers/paypal'
require 'sorcery/providers/slack'
require 'sorcery/providers/wechat'
require 'sorcery/providers/microsoft'
require './lib/monkey_patches/line'
Config.module_eval do
class << self
attr_reader :external_providers
attr_accessor :ca_file
def external_providers=(providers)
@external_providers = providers
providers.each do |name|
class_eval <<-E
def self.#{name}
@#{name} ||= Sorcery::Providers.const_get('#{name}'.to_s.capitalize).new
end
E
end
end
def merge_external_defaults!
@defaults.merge!(:@external_providers => [],
:@ca_file => File.join(File.expand_path(File.dirname(__FILE__)), '../../protocols/certs/ca-bundle.crt'))
end
end
merge_external_defaults!
end
end
end
end
end
end
lib/monkey_patches/line.rb
require 'sorcery/providers/base'
module Sorcery
module Providers
# This class adds support for OAuth with line.com.
#
# config.line.key = <key>
# config.line.secret = <secret>
# ...
#
class Line < Base
include Protocols::Oauth2
attr_accessor :token_url, :user_info_path, :auth_path, :scope
def initialize
super
@site = 'https://access.line.me'
@user_info_path = 'https://api.line.me/v2/profile'
@token_url = 'https://api.line.me/oauth2/v2.1/token'
@auth_path = 'oauth2/v2.1/authorize'
end
def get_user_hash(access_token)
response = access_token.get(user_info_path)
auth_hash(access_token).tap do |h|
h[:user_info] = JSON.parse(response.body)
h[:uid] = h[:user_info]['userId'].to_s
end
end
# calculates and returns the url to which the user should be redirected,
# to get authenticated at the external provider's site.
def login_url(_params, _session)
@state = SecureRandom.hex(16)
authorize_url(authorize_url: auth_path)
end
# tries to login the user from access token
def process_callback(params, _session)
args = {}.tap do |a|
a[:code] = params[:code] if params[:code]
end
get_access_token(args, token_url: token_url, token_method: :post)
end
end
end
end
LINEログインのための設定
基本的には sorcery の wiki にある通りに進めていきます
sorcery / External
(LINE developers の登録などはここでは省略)
initializer/sorcery.rb
LINE関連のパラメーターがないのでこちらを追加
config/initializers/sorcery.rb
Rails.application.config.sorcery.submodules = [:external, ...]
Rails.application.config.sorcery.configure do |config|
...
config.external_providers = [:line]
...
config.line.key = ENV["LINE_KEY"]
config.line.secret = ENV["LINE_SECRET"]
config.line.callback_url = ENV["LINE_CALLBACK"]
config.line.scope = 'profile'
...
あとは dotenv などを利用して環境変数を指定すればLINEログインを使えるようになります!
まとめ
以上が sorcery でLINEログインを実装する方法です。
sorcery もLINEログインに対応してもらえるとありがたいのですが、海外でのLINEの認知度が低いこともありなかなか進んでいないようです。
LINEログインが必要になった際は使ってみてください!
Ruby on Railsのお仕事に関するご相談
Bageleeの運営会社、palanではRuby on Railsに関するお仕事のご相談を無料で承っております。
zoomなどのオンラインミーティング、お電話、貴社への訪問、いずれも可能です。
ぜひお気軽にご相談ください。
この記事は
参考になりましたか?
4
1
関連記事
2021年12月23日
RailsアプリにGoogle Mapから緯度経度情報を取得する機能を追加する
2021年12月22日
RDBでセットメニューを表現する方法
2021年12月11日
Railsでツリー構造アプリを作ってみた
2021年12月10日
Dockerで作成したRailsアプリケーションをHerokuにデプロイする
2021年12月9日
モデルに書いていたメソッドをPOROに切り出してみた!
2021年12月7日
gem cancancanを使ってみた!
簡単に自分で作れるWebAR
「palanAR」はオンラインで簡単に作れるWebAR作成ツールです。WebARとはアプリを使用せずに、Webサイト上でARを体験できる新しい技術です。
palanARへpalanでは一緒に働く仲間を募集しています
正社員や業務委託、アルバイトやインターンなど雇用形態にこだわらず、
ベテランの方から業界未経験の方まで様々なかたのお力をお借りしたいと考えております。
運営メンバー
Eishi Saito 総務
SIerやスタートアップ、フリーランスを経て2016年11月にpalan(旧eishis)を設立。 マーケター・ディレクター・エンジニアなど何でも屋。 COBOLからReactまで色んなことやります。
sasakki デザイナー
アメリカの大学を卒業後、日本、シンガポールでデザイナーとして活動。
やまかわたかし デザイナー
フロントエンドデザイナー。デザインからHTML / CSS、JSの実装を担当しています。最近はReactやReact Nativeをよく触っています。
Sayaka Osanai デザイナー
Sketchだいすきプロダクトデザイナー。シンプルだけどちょっとかわいいデザインが得意。 好きな食べものは生ハムとお寿司とカレーです。
はらた エンジニア
サーバーサイドエンジニア Ruby on Railsを使った開発を行なっています
こぼり ともろう エンジニア
サーバーサイドエンジニア。SIerを経て2019年7月に入社。日々学習しながらRuby on Railsを使った開発を行っています。
ささい エンジニア
フロントエンドエンジニア WebGLとReactが強みと言えるように頑張ってます。
Damien
WebAR/VRの企画・開発をやっています。森に住んでいます。
ゲスト bagelee
かっきー
まりな
suzuki
miyagi
ogawa
雑食デザイナー。UI/UXデザインやコーディング、時々フロントエンドやってます。最近はARも。
いわもと
デザイナーをしています。 好きな食べ物はラーメンです。
taishi kobari
フロントエンドの開発を主に担当してます。Blitz.js好きです。
kubota shogo
サーバーサイドエンジニア。Ruby on Railsを使った開発を行いつつ月500kmほど走っています!
nishi tomoya
aihara
グラフィックデザイナーから、フロントエンドエンジニアになりました。最近はWebAR/VRの開発や、Blender、Unityを触っています。モノづくりとワンコが好きです。
nagao
SIerを経てアプリのエンジニアに。xR業界に興味があり、unityを使って開発をしたりしています。
Kainuma
サーバーサイドエンジニア Ruby on Railsを使った開発を行なっています
sugimoto
asama
ando
iwasawa ayane
oshimo
異業界からやってきたデザイナー。 palanARのUIをメインに担当してます。 これからたくさん吸収していきます!