Auth0での認証実装とSPA(React)の認証方法について再確認
SPAでのAuth0をつかった認証の実装を行い、裏側で何が行われているのかを確認しましょう
実装
Auth0を用いることで非常に簡単に実装を行うことが出来ます。
今回はReactを用います。
手順を下記します。
- ReactのAppを作成します。
- Auth0にアカウントを作成し、auth0-reactというSDKを先ほどのAppにインストールして、ログインページを作って完了
たった2手順でこんなに簡単に出来ます。
ReactのAppを作成
nodeが入っていることは前提です。(Node >= 14.0.0 及び npm >= 5.6)
npx create-react-app my-app
cd my-app
npm start
最後のnpm start
を実行すると自動的にlocalhost:300が立ち上がると思います。
上記画面が出てくれば、React Appが作られたことになります。
Auth0にアカウントを作成/auth0-reactというSDKをインストール/ログインページを作成
Auth0でアカウントを作成します。
作成が終わり、ログインが完了し、下記のURLを押すと下添付のような画像が出てくると思います。
ダッシュボードのURL
左のタブの「Applications」を押して、Create Applicationで新規Auth0Appを作成します。
Reactのため、Single Page Web Applicationを選択し、Createを押します。
作ったApplicationのStettingでApplicatin URLsのセクションに移動し、
- Allowed Callback URLs
- Allowed Logout URLs
- Allowed Web Origins
の欄に「http://localhost:3000」と入力してください。
最後にSettingページ最下部のSave Changesを押します。
アプリを起動した先ほどのターミナルで
npm install @auth0/auth0-react
を実行してAuth0用のReactのSDKをインストールします。
先ほど作成したmy-appのsrc/index.jsを下記のように変えてください。
const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(
<Auth0Provider
domain="YOUR_DOMAIN"
clientId="YOUR_CLIENT_ID"
authorizationParams={{
redirect_uri: window.location.origin,
}}
>
<App />
</Auth0Provider>
);
your domain と your client idはAuth0のダッシュボードから取得できます。
App.jsを編集する。
import logo from "./logo.svg";
import "./App.css";
import { useAuth0 } from "@auth0/auth0-react";
function App() {
const { loginWithRedirect, logout, isAuthenticated, user } = useAuth0();
return (
<div className="App">
<header className="App-header">
<img src={logo} className="App-logo" alt="logo" />
<p>
Edit <code>src/App.js</code> and save to reload.
</p>
<a
className="App-link"
href="https://reactjs.org"
target="_blank"
rel="noopener noreferrer"
>
Learn React
</a>
<button onClick={() => loginWithRedirect()}>Login</button>
{isAuthenticated && (
<div>
<img src={user.picture} alt={user.name} />
<h2>{user.name}</h2>
<p>{user.email}</p>
</div>
)}
<button onClick={() => logout()}>Logout</button>
</header>
</div>
);
}
export default App;
ログインボタンを押すと、Auth0のログインページにリダイレクトされる。
Googleアカウントがあれば、下のGoogleアカウントでログインのボタンを押してみてください。
確認画面はAcceptします。ログイン成功すると下記画面が出てきます。
Logoutボタンを押すと消えることがわかります。
再確認
実装としては、以上になるのですが、Auth0がどうやって認証を行っているかを確認します。
詳しくは下記を見れば分かりますが、自分でも理解するためにまとめてみます。
-
ログインボタンを押す
Auth0SDKが暗号化されたランダムなcode_verifier
とそれを使ったcode_challenge
を生成する
code_challenge
を含めて自分のAuth0ドメイン/authorize
のURLを叩いてAuth0のサーバーにリダイレクトする
-
ユーザー情報を打ち込んでログインする
まず、request_headerに書いてあった、code_challenge
をAuth0の認可サーバーに保存する
そして、認証code
を付与してアプリケーションにリダイレクトしてくる
-
IDトークンとアクセストークンを取得する
上で取得したcode
と作っていたcode_varifier
を用いてAuth0認可サーバーのエンドポイント(/oauth/token)のを叩く。
認可サーバーではcode_challenge
とcode_verifier
を検証してあっていれば、Auth0認可サーバーがIDトークンとアクセストークンを返却します。
-
アクセストークンを使ってAPI経由でユーザー情報を取得します。
疑問
アクセストークンの置き場所は?インメモリは見ることできない?
ユーザー情報を取ってきている通信が見当たらないが、どこで行っているのか?
FYI
React Auth0の公式Doc
Discussion