omniauthでLINEでログインを実装するの記事でOmniAuth::Lineを改変したのですが、そもそもOAuth認証じゃなくてOpenID Connectに対応したのだから、そっちにプラグイン作った方が良いなーと思い、勉強がてら作りました。
- omniauth-line-openid-connect | RubyGems.org
- tzmfreedom/omniauth-line-openid-connect: OmniAuth provier for Line with 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