Auth0 のプログラミング中にちとハマった内容を備忘録メモとして残しておきます。

【背景】
ウェブのサービスやアプリを作る際に、いわゆる IDaaS(ID as a Service : ユーザー管理機能の SaaS) を使うことが多くあります。自分がよく使っているのは Auth0AppID です。ユーザーのログイン/ログアウトだけでなく、作ろうとすると面倒なオンラインサインアップの機能などもまとめて API で提供されていて、ユーザー管理周りを任せてしまうことが多いです。特に Auth0 を Node.js で使う場合は専用のライブラリも提供されていて、これを使うことで簡単に連携サービスを作っていました。

先日、Auth0 を使ってサービスの開発をしている時に「ログアウト」がうまくできないことに気付きました。以前は以下のようなコードでログアウトできていたのですが、これだとエラーは発生しないものの、セッションなのかクッキーなのか、よくわかりませんが情報が残ってしまってログアウトできていませんでした(以下のコードだとログイン情報が残ったままトップページに遷移してしまう):
app.get( '/auth0/logout', function( req, res ){
  req.logout( function(){   //. ログアウトして、
    res.redirect( '/' );    //. ログアウト後にトップページ('/')に移動する
  });
});

あれ~、以前はこのコードで動いてたんだけどな・・・ と思ってよく調べてみると、2021 年12月にログアウト処理の仕様が変わっていたようでした:
Logout Redirects Migration Guide


このあたりを踏まえて、現状の Auth0 ログアウト実装方法を調べたので、以下に記載します。

【ログアウト実装準備】
まず準備段階として、Auth0 でログアウトを行う場合に「ログアウト後に移動する先の URL」をあらかじめ登録しておく必要があります。Auth0 ログイン後の Applications メニューから該当アプリを選択した先の "Allowed Logout URLs" という項目です:
2022090401


コールバック URL 同様に、ここにログアウト後に遷移する URL を事前に登録しておかないといけないようでした。自分の場合は開発時は localhost を使うので、これと本番時の URL (https://xxxxx.xxxxxxx.com)を合わせて(カンマ区切りで)以下のように指定しました:
http://localhost:8080,https://xxxxx.xxxxxxx.com

これでログアウト処理を実装するために必要な準備は完了です。


【ログアウト実装】
現在のログアウト仕様は以下で確認できました。結論としてはクライアント(ブラウザ)が https://(Auth0 ドメイン)/v2/logout に必要なパラメータを付与して GET リクエストを出すことで正しくログアウトできるようです:
https://auth0.com/docs/api/authentication#logout

サーバーサイドのプログラム上だと以下のようになります:
app.get( '/auth0/logout', function( req, res ){
  req.logout( function(){   //. ログアウトして、
    //res.redirect( '/' );    //. ログアウト後にトップページ('/')に移動する
    res.redirect( 'https://(Auth0 のドメイン)/v2/logout?client_id=(Auth0 クライアントID)&returnTo=http://localhost:8080' ); 
  });
});

このうち、Auth0 ドメインと Auth0 クライアント ID はアプリケーションを登録する際に同時に確認/取得できるものです。また returnTo パラメータを付けないと、ログアウト処理は行われるのですが、そのまま処理が終わってしまうので、事実上 returnTo パラメータも必須です。このパラメータにログアウト後に遷移する URL を指定します。この URL は上述の準備時に Allowed Logout URLs で指定した中に含まれている必要があります(事前に指定した Allowed Logout URLs に含まれていないとエラー)。


この変更で正しくログアウトできるようになることが確認できました。ほっ・・・