FirebaseアプリでLINEログインを実装する(2)

広告:超オススメUnity Asset
  広告:超オススメUnity Asset

だいぶ前にiPhone用のFirebaseアプリにLINEログイン機能を追加することに挑戦していたのですが、LINEログイン側がバージョンアップしたことにより、独自サーバーに設置したnode.jsのコードが

Authentication error: Cannot verify access token.

を出すようになってしまい、結果的にLINEログインできなくなっていました。LINE開発者になるところからXcodeに組み込むまでの流れは過去のMEMOをご参考に。

Facebookログイン、Twitterログインを使った認証は、あらかじめFirebase側に用意されたログイン方法なのでわりとシンプルに利...

サンプルとして提供されていたコードは、v1対応のままでしたので、v2.1に合わせて、書き直してこちらのGitHubにForkして書いておきました。

Samples showcasing how to sign in Firebase using additional Identity Providers - mushikago/custom-auth-samples

上記のコードのうち、verifyLineToken部分が肝です。ここでエラーが起こると、シンタックスエラーがあった場合でも、全てエラーメッセージが’Authentication error: Cannot verify access token.’となる感じで書かれています。

LINEログインv1の提供終了

こちらの発表に記載がありましたが、

2018年6月30日に提供終了

検証エンドポイント:https://api.line.me/v1/oauth/verify

Lineから取得したTokenを検証するエンドポイントが2018年6月30日に終了していました。(だいぶ前。。。)

仕様に大きな変更がなければ、エンドポイントのuriを変更するだけでも良さそうだったのですが、肝心な部分として MID っつーものがレスポンスからなくなったため、Firebase側でユニークなIDを作成できなくなりました。

midの代わりにuserIdを使ってFirebaseUidを作成

MIDをユーザーIDに変換する

LINEログインv2以降では、ユーザーはMIDではなくユーザーIDで識別されます。

ここに記載があるように、ユーザーIDを改めて調べる部分を追加せねばなりません。

(70行目)
rp(getProfileOptions).then(response => {
(中略)
const firebaseUid = `line:${response.userId}`;

部分を追加し、firebase用のUidを作成しました。getFirebaseUserの第一引数はもう使わないので削除しておきました。

Firebase側がLINEログインをずっと無視しているので自作せねばなりませんが、まだこの先も同じことが起こる可能性があるので注意が必要ですね。

検証用 Xcode SwiftUI

検証用のXcode SwiftUIの ContentView.swift をGistにアップしときました。 https://gist.github.com/mushikago/03a5548d84cc168fcc213373c47c67e4

info.plist に以下のように書いておくと動作します。また、Firebaseコンソールから取得するGoogleService-info.plistもお忘れなく。

<key>LineSDKConfig</key>
<dict>
<key>ChannelID</key>
<string>XXXXXXXXXX</string>
<key>ValidationServerDomain</key>
<string>https://xxxxxx.herokuapp.com</string>
</dict>

おまけメモ

  • Herokuでnode.jsを動作させている場合、console.logをすると、「heroku logs -t –app アプリ名」で出力しながらデバグできます。
  • generateLineApiRequestForVerifyという関数を作っていますが、// -> uri + '?access_token=xxxxx%20xxxxx’ という形で検証するための request-promise のためのオプション生成関数です。
  • equest-promise -> https://github.com/request/request-promise