4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

LINEミニアプリでIDトークンを検証する時の通信で500エラーになった時の対処法

4
Last updated at Posted at 2025-08-05

前提

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である必要があるケースはあると思うので、今後は注意したいと思います。

4
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
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?