現時点(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サービスを使ってみる

