FlaskでLINE・Facebookログインを実装する方法を完全ガイド!初心者でもわかる認証の基本と実装パターン
生徒
「FlaskでLINEログインやFacebookログインってできるんですか?スマホアプリみたいなログイン画面をWebサイトにも付けられますか?」
先生
「もちろんできますよ。FlaskはPythonで作られた軽量なWebフレームワークで、外部サービスの認証を組み込むのがとても簡単です。」
生徒
「スマホアプリのログインと同じ仕組みって、どうしてWebでも使えるんですか?」
先生
「LINEやFacebookはOAuthという仕組みで認証を提供していて、Webページでも同じ方式を使えるからです。では、どのように使うのかを一緒に見ていきましょう。」
1. FlaskでLINE・Facebook認証を実装する仕組みとは?
FlaskでLINEログインやFacebookログインを実装するには、まず「外部サービスの認証を借りる」という考え方を理解する必要があります。外部認証とは、ユーザーがあなたのWebアプリにIDやパスワードを入力する代わりに、LINEやFacebookに一度ログインして本人確認をしてもらう仕組みのことです。これによって、ユーザーは面倒な登録をせずに、普段使っているSNSアカウントで簡単にログインできます。初心者の方には、家の鍵を自分で持つのではなく、スマートロックサービスに鍵を預けて、アプリで本人確認してもらうイメージと説明するとわかりやすいかもしれません。
Flaskでこれを行うためには、まずユーザーをLINEまたはFacebookのログイン画面へリダイレクトし、ログイン後に返ってくるトークンを受け取って確認する必要があります。これがいわゆる「OAuth認証フロー」です。OAuthという言葉は専門的に聞こえますが、実は流れはとてもシンプルで、ユーザーが外部サービスで承認し、その結果をFlaskが受け取るだけです。
2. LINEログインの実装パターンを理解しよう
LINEログインは、LINE Developers Consoleという管理画面でチャネル(アプリのようなもの)を作成して設定を行います。そして、Flask側ではチャネルIDとチャネルシークレットを使ってログインURLを作成し、ユーザーを誘導します。ログイン後のコールバックURLにアクセスが戻ってくるため、そのときにアクセストークンを取得してユーザー情報を取得します。この流れは、Flaskと外部サービスが協力して本人確認をしているようなものです。
次のようなログインURLを作成してブラウザで開いてもらいます。
from flask import Flask, redirect, request
import requests
import urllib.parse
app = Flask(__name__)
LINE_CLIENT_ID = "あなたのチャネルID"
LINE_CLIENT_SECRET = "あなたのチャネルシークレット"
REDIRECT_URI = "https://example.com/callback"
@app.route("/login/line")
def login_line():
base = "https://access.line.me/oauth2/v2.1/authorize"
params = {
"response_type": "code",
"client_id": LINE_CLIENT_ID,
"redirect_uri": REDIRECT_URI,
"state": "random_state_string",
"scope": "profile openid email"
}
url = base + "?" + urllib.parse.urlencode(params)
return redirect(url)
3. LINEのトークンを受け取りユーザー情報を取得する
ユーザーがLINEで承認すると、あなたが設定したコールバックURLに認証コードが送られます。このコードを使ってアクセストークンを取り、そこからユーザーの名前やIDを取得します。まるで、鍵の番号を受け取ってその鍵を開けるための本物の鍵をLINEから受け取るようなイメージです。
@app.route("/callback")
def callback():
code = request.args.get("code")
token_url = "https://api.line.me/oauth2/v2.1/token"
data = {
"grant_type": "authorization_code",
"code": code,
"redirect_uri": REDIRECT_URI,
"client_id": LINE_CLIENT_ID,
"client_secret": LINE_CLIENT_SECRET
}
token_res = requests.post(token_url, data=data).json()
access_token = token_res["access_token"]
profile_res = requests.get(
"https://api.line.me/v2/profile",
headers={"Authorization": f"Bearer {access_token}"}
).json()
return profile_res
4. Facebookログインの実装パターンを理解しよう
Facebookログインも、基本的な流れはLINEとほとんど同じです。Facebook for Developersからアプリを作成し、アプリIDとシークレットを取得します。そして、Flask側でログインURLを作り、ユーザーにFacebookの認証ページに進んでもらいます。このようなSNSログインは、パソコンが苦手な人でもボタンを押すだけで完了するため、現代のWebサービスでは当たり前に使われています。
@app.route("/login/facebook")
def login_facebook():
fb_url = "https://www.facebook.com/v15.0/dialog/oauth"
params = {
"client_id": FB_APP_ID,
"redirect_uri": FB_REDIRECT_URI,
"state": "facebook_state",
"scope": "email,public_profile"
}
return redirect(fb_url + "?" + urllib.parse.urlencode(params))
5. Facebookからアクセストークンを取得しプロフィール情報を読む
Facebookでは認証後、コードが返ってくる点まではLINEと同じです。ただしアクセストークンを取得するURLが異なります。外部サービスごとに細かな違いはありますが、基本の考え方は共通ですので、慣れればすぐに応用できるようになります。
@app.route("/callback/facebook")
def facebook_callback():
code = request.args.get("code")
token_url = "https://graph.facebook.com/v15.0/oauth/access_token"
params = {
"client_id": FB_APP_ID,
"redirect_uri": FB_REDIRECT_URI,
"client_secret": FB_APP_SECRET,
"code": code
}
token_res = requests.get(token_url, params=params).json()
access_token = token_res["access_token"]
profile_url = "https://graph.facebook.com/me"
profile = requests.get(profile_url, params={"access_token": access_token, "fields": "id,name,email"}).json()
return profile
6. Flaskで複数SNSログインをまとめて実装する考え方
LINEログインとFacebookログインを両方実装する場合でも、フローはとてもよく似ています。そのため、統一された認証処理としてまとめやすいのが特徴です。認証処理を一つのクラスにまとめたり、サービスごとに関数を用意したりすると、管理しやすい構成になります。また、現代のWeb開発ではSNSログインを搭載することがユーザー体験の向上に直結し、パスワード管理の負担も減らせます。
Flaskは軽量ながら拡張がしやすく、認証に関するライブラリも充実しているため、外部サービスを利用したログイン機能を簡単に追加できます。初心者の方が最初に実装する認証としても、SNSログインは取り入れやすい選択肢です。