2017-10-12

OmniAuth::LineOpenidConnectを作った話

omniauthでLINEでログインを実装するの記事でOmniAuth::Lineを改変したのですが、そもそもOAuth認証じゃなくてOpenID Connectに対応したのだから、そっちにプラグイン作った方が良いなーと思い、勉強がてら作りました。

基本的にはOmniAuth::Strategies::OpenIDConnectをextendして、ところどころLINE用にカスタマイズしている、という感じです。

公式ドキュメント的には LINEログインではHMAC SHA-256のみを使用します。とのことなので、署名アルゴリズムにHS256を使ってます。内部的にはHS256を指定するとsecretを秘密鍵として使ってくれます。issuerはJWT検証に使われるパラメータなので、予め設定しておきます。

option :issuer, 'https://access.line.me'
option :client_auth_method, :body
option :client_signing_alg, :HS256
option :client_options, {
    port: 443,
    scheme: 'https',
    host: 'access.line.me',
    identifier: nil,
    secret: nil,
    redirect_uri: nil,
    authorization_endpoint: '/oauth2/v2.1/authorize',
    token_endpoint: '/oauth2/v2.1/token',
    userinfo_endpoint: '/v2/profile'
}

identifierとsecretはnilが指定されていますが、これはclient_optionsのハッシュ内に設定する方式だとネストが深くなって嫌だったのでOAuth2系のプラグインと同じように第一引数にclient_id、第二引数にclient_secretを入れる方式を取りました。なので、ここらへんでマージしています↓

def request_phase
  options[:client_options].merge!(identifier: options[:client_id],
                                 secret: options[:client_secret],
                                 redirect_uri: callback_url)
  super
end

def callback_phase
  options[:client_options].merge!(identifier: options[:client_id],
                                 secret: options[:client_secret],
                                 redirect_uri: callback_url,
                                 host: 'api.line.me')
  super
end
このエントリーをはてなブックマークに追加