現時点(2021年)でおそらく一番ポピュラーな認証プロトコルであるOpenID Connectですが、その実装方法を具体的に示した日本語記事は案外少ないようです。
今回はReactを使ってOpenID Connectによるログイン認証処理を実装し、その使い方をまとめてみました。
~目次~
- ReactでOpenID Connectを実装する~その1 準備 ☆この記事☆
- ReactでOpenID Connectを実装する~その2 Auth0サービスを使ってみる (Auth0設定編)
- ReactでOpenID Connectを実装する~その3 Auth0サービスを使ってみる (アプリ開発編)
- ReactでOpenID Connectを実装する~その4 react-oidcを使ってみる
ReactでOpenID Connectを実装する~その5 自前認証プロバイダを立ち上げてみる(処理フロー編) - ReactでOpenID Connectを実装する~その6 自前認証プロバイダを立ち上げてみる(認証プロバイダ編)
- ReactでOpenID Connectを実装する~その7 自前認証プロバイダを立ち上げてみる(認証利用アプリ編)
- ReactでOpenID Connectを実装する~その8 あとがき
OpenID Connectとは
OpenID Connectは認証プロトコルの標準規約です。
これまでは自分のシステム内で実装していたログイン認証処理を、他サーバー(OpenID Provider)に 代わりにやってもらい、自分のシステムではその認証結果だけを受け取る方式になります。
OpenID Connectでは以下の登場人物が現れます。
-
認証プロバイダ
-
正式名称はOpenID Provider(略称OP)ですが本ブログでは認証プロバイダと呼ぶことにします。ログインIDとパスワードで認証処理をしたり、認証利用アプリ(RP)からの要求を受けて、名前やEメールアドレスなど属性情報の取得を認可したりします。
-
AWS,Azure,Google Cloudなど主要なクラウドサービスでは基本的なIDプラットフォームとして提供されているので、それらを使うのが一般的なようです。
-
認証利用アプリ
-
正式名称はRelying Party(略称RP)ですが本ブログでは認証利用アプリと呼ぶことにします。認証プロバイダに認証要求(IDトークンの発行依頼)や認可要求(アクセストークンの発行依頼)を行います。いわゆるサーバーアプリケーションです。
-
ブラウザ
-
認証利用アプリにアクセスするためのクライアントアプリです。ChromeやEdgeなどが一般に使われます。
-
エンドユーザ
-
ブラウザを操作し認証利用アプリにアクセスする人です。
OpenID Connectを実装するにあたり、上記の登場人物とその間で行われる通信フローを理解しておく必要があります。 理解の助けとなるサイトをいくつかご紹介しますので、これらを読んで大まかの流れを理解してください。
Reactでシンプルな画面を作る
ログイン認証処理を実装する前に、認証処理のないシンプルな画面をReactで作成します。
環境
以下の環境でプログラムを動作させました。
-
- OS Ubuntu 20.04.2
※自分はWindows10にWSL2をインストールしその上でUbuntuを起動させました。 - Node.js V14.17.4
- Npm V6.14.14
- react V17.0.2
- OS Ubuntu 20.04.2
-
WSL2(Windows Subsystem for Linux 2)はWindows 10のバージョン1903以上が必要です。WSL2のインストール方法は、Microsoftの公式ページなどを参考にしてください。もちろん素のUbuntuやCentOSなどを使用していただいても問題ありません。
インストール
Ubuntu上にnode.jsをインストールします。
$ curl -sL https://deb.nodesource.com/setup_14.x | sudo bash - ## Installing the NodeSource Node.js 14.x repo... ...中略... Reading package lists... Done $ sudo apt-get install -y nodejs
正常にインストールできているかバージョンを確認します。
$ node -v v14.17.4 $ npm -v 6.14.14
React(CreateReactApp)をインストールします。
$ sudo npm -g install create-react-app
Reactアプリ(authsample0)を準備する
まず今回作成するReactアプリ(authsample0)のひな型を作ります。
以下のコマンドを実行します。
$ create-react-app authsample0
これでauthsample0というディレクトリが作成され、その配下にReact用のひな型アプリが作成されます。
それではReactがデフォルトで用意している画面を表示してみます。以下のようにNode.jsを起動します。
$ cd authsample0 $ npm start Compiled successfully! You can now view authsample0 in the browser. Local: http://localhost:3000 On Your Network: http://xxx.xxx.xxx.xxx:3000
正常に起動すると標準出力にIPアドレスやポート番号(通常は3000)が表示され、ブラウザが自動的に起動します。
Reactアプリ(authsample0)のソースを記述する
ヘッダ部とコンテンツ部だけがあるシンプルな画面を作ります。こんな感じです。
App.js
create-react-appコマンドで自動的に作成されたApp.jsを次のように書き換えます。
import React from 'react'; import AppHeader from './AppHeader'; import AppContents from './AppContents'; import './App.css'; function App() { // 画面表示処理 return ( <div className="App"> <div className="AppHeader"><AppHeader /></div> <div className="AppContents"><AppContents /></div> </div> ); } export default App;
<AppHeader />でヘッダ部を表示し、<AppContents />でメインとなるコンテンツ部を表示します。
AppHeader.js
次にヘッダ部のソース(AppHeader.js)を新規に作ります。
import React from 'react'; import './AppHeader.css'; function AppHeader() { // ログアウトボタン押下時 const handleLogout = (event) => { console.log(event.target.value); } // 画面表示処理 return ( <div className="AppHeader"> <span></span> <span>OpenID Connect Sample 0</span> <span className='right'> <button onClick={handleLogout}>Logout</button> </span> </div> ); } export default AppHeader;
右端にLogoutボタンを配置し、クリックされたらhandleLogout関数を呼び出すようにします。現時点ではボタンを押しても何もしません。
AppContents.js
次にコンテンツ部(AppContents.js)のソースを新規に作ります。
import React from 'react'; import './AppContents.css'; function AppContents() { // 画面表示処理 return ( <div className="AppContents"> メイン表示領域 </div> ); } export default AppContents;
ディレクトリ内のファイル構成は、このような感じになります。
これで最初に示したようなシンプルな画面が表示されます。
本画面のサンプルソースはこちらからダウンロードできます。
このシンプルな画面にログイン認証処理を追加していくのですが、その前に認証サービスを提供しているAuth0サービスの設定をしていきましょう。
ReactでOpenID Connectを実装する~その2 Auth0サービスを使ってみる