前提
LINEミニアプリではユーザーのプロフィール情報を取得することが出来ますが、セキュリティ上の問題を回避するため、IDトークン(JSON Web Token形式)を用いた検証をバックエンドで行ってプロフィール情報を取得する必要があります。
検証する時に以下のようなコードを書いていました。 今回の使用言語はRubyです。
require "net/http"
require "uri"
def create
id_token = params[:id_token]
uri = URI.parse("https://api.line.me/oauth2/v2.1/verify")
req = Net::HTTP::Post.new(uri)
req["Content-Type"] = "application/x-www-form-urlencoded"
req.set_form_data({ "id_token" => id_token, "client_id" => ENV["LINE_LIFF_CHANNEL_ID"] })
res = Net::HTTP.new(uri.hostname, uri.port).start { |http| http.request(req) }
result = JSON.parse(res.body)
uid = result["sub"]
end
この状態で通信しようとした時、「500 Error」が発生してしまいました。
原因
これの原因は「リクエスト先のLINE APIとの通信にはHTTPSであることが必要にも関わらず、HTTPS通信になっていない」ということです。
デフォルトではHTTP通信で行おうとするため、明示的にHTTPS通信にするようにしなければいけません。
修正したコード
以下の該当コードを次のように修正します。
# 該当のコード
uri = URI.parse("https://api.line.me/oauth2/v2.1/verify")
http = Net::HTTP.new(uri.hostname, uri.port)
res = http.start { |http| http.request(req) }
修正後のコード
uri = URI.parse("https://api.line.me/oauth2/v2.1/verify")
http = Net::HTTP.new(uri.hostname, uri.port)
http.use_ssl = true # ← 明示的にhttps通信とする行を追加
res = http.start { |http| http.request(req) }
use_ssl = true を書くと、Rubyの Net::HTTP はSSL/TLSで暗号化された通信を行うように切り替わります。 こうすることでエラーが出ずに正常に通信が行えるようになりました!
他の外部APIの通信などでもHTTPSである必要があるケースはあると思うので、今後は注意したいと思います。