LINEログイン機能の実装 -エラーまとめ-

# はじめに
今回、LINEログイン機能を実装するにあたってエラーにぶつかり、時間を浪費したためメモがてらまとめて見ようと思います。
調べれば出る内容ですので特に目新しいことはありませんが、同じように悩まれた方の参考になれば幸いです。

# 環境・Gem
・Docker version 20.10.23
・Rails 7.0.4
・sorcery (0.16.4) 

# 実装
実装に関しては、以下の記事を参考にしました。
1. [ドキュメント](https://developers.line.biz/ja/docs/)
2. [【Rails】Sorceryで外部認証 〜LINE編〜](https://qiita.com/tarakish/items/a4c73104375878ad61c5)

その過程で詰まったことを以下に書いていきます。
# エラー
### その１　mkcertでローカルをSSL化できなかった。

mkcertを用いてSSL化にトライしましたが、Dockerを使用しているためかうまくいきませんでした。（原因わからず）
そこで、ngrokを使用することにしました。
※ngrokとは、Webアプリやlocalhostを外部から安全かつ簡単にアクセスできるようにするツールです([参考記事](https://www.geeklibrary.jp/counter-attack/ngrok/#:~:text=%E3%81%AE%E3%81%99%E3%81%91-,ngrok%E3%81%A8%E3%81%AF,-ngrok%E3%81%A8%E3%81%AF))

#### 1. [公式サイト](https://ngrok.com/)でユーザーの登録
#### 2.公式サイト通りに進めていく
自分の環境に合う、zipファイルをダウンロードする。
そして、```unzip /path/to/ngrok.zip```をターミナルで入力します。
次に、トークンを用いてアカウントとPCを連携します。
```
ngrok config add-authtoken xxxxxxxxxxxxxxxxxxx_xxxxxxxxxxxxxxxxxxxx
```
#### 3. zipファイルの解凍
自分の場合、Downloadsディレクトリにzipファイルがあったので、アプリのルートディレクトリで
```
unzip ~/Downloads/ngrok-v3-stable-darwin-amd64.zip
```
をターミナルで入力。
するとルートディクレトリ内に
![スクリーンショット 2023-04-10 14.10.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2521935/cc4078db-70e1-ef96-db91-ccf81810609d.png)
ngrokがあると思います。

#### 4. https化したURLを発行
```
./ngrok http 3000
```
上記コマンドを入力すると、以下の画面が現れると思います。
```
ngrok                                                                                  (Ctrl+C to quit)

Announcing ngrok-rs: The ngrok agent as a Rust crate: https://ngrok.com/rust

Session Status                online
Account                       hoge@gmail.com (Plan: Free)
Version                       3.2.2
Region                        Japan (jp)
Latency                       21ms
Web Interface                 http://xxx.x.x.x:xxxx
Forwarding                    https://25f4-240f-98-2ed6-1-ece0-d02b-2159-58e1.ngrok-free.app -> http://

Connections                   ttl     opn     rt1     rt5     p50     p90
                              0       0       0.00    0.00    0.00    0.00
```
この画面は開いたままにしておき、サーバーを起動する際は別のタブで行いましょう。


#### 5. httpsになったURLを登録する
まずは以下に記述しておきます。
```config.settings.ddevelopment.yml
sorcery:
  line_callback_url: 'https://25f4-240f-98-2ed6-1-ece0-d02b-2159-58e1.ngrok-free.app/oauth/callback?provider=line'
```
同じURLをLINE DevelopersのLINEログイン設定にも登録します。
![スクリーンショット 2023-04-10 14.46.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2521935/7102bb14-bc73-1a3e-8807-2f720d89ef13.png)

これでサーバーを開くと、問題なく挙動するはずです。

ちなみに発行したURLは２時間で有効期限が切れます。
その都度変更するのが手間な人は、[こちらの記事](https://qiita.com/kujira_engineer/items/ce8f0f7e025324afc6b6#tips1--%E6%9C%89%E5%8A%B9%E6%9C%9F%E9%99%90%E3%82%92%E8%A7%A3%E9%99%A4%E3%81%99%E3%82%8B)に書いてあります。


### その２　400 Bad Request 
これに関しては、[こちらの記事](https://support.ec-force.com/hc/ja/articles/4407310334361-LINE-ID%E9%80%A3%E6%90%BA%E3%81%8C%E6%AD%A3%E5%B8%B8%E3%81%AB%E5%8B%95%E4%BD%9C%E3%81%97%E3%81%AA%E3%81%84%E5%A0%B4%E5%90%88%E3%81%AE%E3%82%88%E3%81%8F%E3%81%82%E3%82%8B%E4%BA%8B%E4%BE%8B)が書いてくれています。
コールバックURLが間違えるとないもできないので、ngrokを使用する場合はしっかりとURLを合わせておくようにしてください。

### その3　バリデーションにひっかかる
LINEログイン画面を表示することができ、いざログインしてみると、「Lineでのログインに失敗しました」とメッセージが出てroot_pathにリダイレクトされていました。
ログを見てみると、
```
2023-04-09 11:47:05 Started GET "/oauth/callback?provider=line&code=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" for xxxx:xx:xxxx:x:xxxxxx:xxxxx:xxxx:xxxxxx at 2023-04-09 11:47:05 +0900
2023-04-09 11:47:05 Cannot render console from xxxx:xx:xxxx:x:xxxxxx:xxxxx:xxxx:xxxxxx! Allowed networks: xxx.x.x.x/xxx.xxxx.xxx.xxx, ::1
2023-04-09 11:47:06 Processing by OauthsController#callback as HTML
2023-04-09 11:47:06   Parameters: {"provider"=>"line", "code"=>"xxxxxxxxxxxxxxxxxx", "state"=>"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}
2023-04-09 11:47:06   Authentication Load (0.3ms)  SELECT "authentications".* FROM "authentications" WHERE "authentications"."uid" = $1 AND "authentications"."provider" = $2 ORDER BY "authentications"."id" ASC LIMIT $3  [["uid", "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"], ["provider", "line"], ["LIMIT", 1]]
2023-04-09 11:47:06   ↳ app/controllers/oauths_controller.rb:10:in callback' 2023-04-09 11:47:06   TRANSACTION (0.2ms)  BEGIN 2023-04-09 11:47:06   ↳ app/controllers/oauths_controller.rb:14:in callback'
2023-04-09 11:47:06   User Create (1.1ms)  INSERT INTO "users" ("name", "email", "crypted_password", "salt", "created_at", "updated_at", "role", "reset_password_token", "reset_password_token_expires_at", "reset_password_email_sent_at", "access_count_to_reset_password_page") VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11) RETURNING "id"  [["name", nil], ["email", nil], ["crypted_password", nil], ["salt", nil], ["created_at", "2023-04-09 11:47:06.264918"], ["updated_at", "2023-04-09 11:47:06.264918"], ["role", 0], ["reset_password_token", nil], ["reset_password_token_expires_at", nil], ["reset_password_email_sent_at", nil], ["access_count_to_reset_password_page", 0]]
2023-04-09 11:47:06   ↳ app/controllers/oauths_controller.rb:14:in callback' 
2023-04-09 11:47:06   TRANSACTION (0.2ms)  ROLLBACK 
2023-04-09 11:47:06   ↳ app/controllers/oauths_controller.rb:14:in callback'
```
このエラーはuser.createのバリデーションで失敗していました。
解決方法としては、sorcery.rbに
```
config.line.key = Rails.application.credentials.dig(:line, :channel_id)
  config.line.secret = Rails.application.credentials.dig(:line, :channel_secret)
  config.line.callback_url = Settings.sorcery[:line_callback_url]
  config.line.scope = 'profile'
  config.line.bot_prompt = 'aggressive'　　　　　追記１
  config.line.user_info_mapping = {　　　　　　　追記2
    name: 'displayName',
    email: 'userId'
  }
```
を記述すると解決しました。
自分の場合、usersテーブルにはnameカラムとemailカラムしかないですが、設計によって変わると思うので、注意して記述するようにしましょう。

存在しないカラムを記述していると、エラー文も出ず、ログイン出来ないです。
例えば、userテーブルにnameカラムしかない場合、```email: 'userId'```を記述していると、oauth_controllerのcreate_fromメソッドで、「emailカラムはないよ」と怒られてログイン出来ないです。
デバッグすればわかることなので、しっかり確認するようにしましょう！
自分はここでめちゃくちゃハマりました（ポンコツ。。。）

[こちらの内容](https://qiita.com/tarakish/items/a4c73104375878ad61c5#c%E5%8F%96%E5%BE%97%E6%83%85%E5%A0%B1%E3%81%AE%E8%A8%AD%E5%AE%9A)をしっかり読んでいればこのようなエラーに当たることもないので、注意してください。

# おわりに🙇🏻‍♂️
冒頭に記載した通り、目新しいことは書いてありませんが少しでも役に立てれば幸いです。
まだまだ学習中の身のため間違っている点や補足、タイポなどありましたら
お気軽にコメント、編集リクエストいただけますと幸いです！！

# 参考記事
・[【Rails】Sorceryで外部認証 〜LINE編〜](https://qiita.com/tarakish/items/a4c73104375878ad61c5)
・[Sorcery External](https://github.com/Sorcery/sorcery/wiki/External)
・[【Rails】SorceryでTwitter認証](https://blog.aiandrox.com/posts/tech/2020/03/29/)
・[LINE Developersに登録](https://qiita.com/s10aim_tana/items/2d174d4e31e4041700ee#3line-developers%E3%81%AB%E7%99%BB%E9%8C%B2)