ReactとAuth0でソーシャルログイン
React の Auth0 用の sdk を用いて Auth0 の Twitter ログインを行いました。
こちらの Auth0 の公式解説をもとに実装しました。
https://auth0.com/docs/quickstart/spa/react/01-login
https://marketplace.auth0.com/integrations/twitter-social-connection
https://auth0.com/docs/libraries/auth0-react
Auth0 への登録、TwitterDevelopper への登録は済んでいる前提でいきます。
Auth0 の管理画面でアプリケーション作成する。
右上の Create Application をクリック
今回はidol-otaku-project
を作成します。
そのほかのプロジェクトはデフォルトで作られているプロジェクトです。
作成したらidol-otaku-project
を選択し、そのまま下にスクロールして以下のApplication URIsの項目を埋めます。
Allowed Callback URLs
Allowed Logout URLs
Allowed Web Origins
Allowed Origins (CORS)
以上の 4 項目に
http://localhost:3001(ローカルで使用するポートを設定)
を追加
次にプロジェクトの Twitter とのコネクションを有効にしておきます。
Twitter Developper で作成したプロジェクトに auth0 のテナントの URL を入力します。
テナントのドメインは作成したプロジェクトの Settings に書いてあります。
以下のように登録
Website URL: <テナントのドメイン>
Callback URI : <テナントのドメイン>/login/callback
任意のディレクトリ作成
mkdir frontend
cd frontend
react アプリケーション作成。
$ yarn create react-app .
必要な環境変数を作成します。
$ touch .env
※ []はいりません。文字列のみ入力してください。
// ローカルで起動時のポート
PORT=3001
// auth0のテナントのドメイン
REACT_APP_AUTH0_DOMAIN=[Domain]
// auth0のフロントエンドアプリケーションのClient ID
REACT_APP_AUTH0_CLIENT_ID=[Client ID]
auth0 用の sdk をインストール
yarn add @auth0/auth0-react
frontend/src/index.js
を以下のように編集
import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.css';
import App from './App';
import reportWebVitals from './reportWebVitals';
import { Auth0Provider } from '@auth0/auth0-react';
const domain = process.env.REACT_APP_AUTH0_DOMAIN || '';
const clientId = process.env.REACT_APP_AUTH0_CLIENT_ID || '';
const container = document.getElementById('root');
const root = ReactDOM.createRoot(container);
root.render(
<Auth0Provider
domain={domain}
clientId={clientId}
redirectUri={window.location.origin}
>
<App />
</Auth0Provider>
);
frontend/src/App.js
を編集
import './App.css';
import { useAuth0 } from '@auth0/auth0-react';
function App() {
const { user, isAuthenticated, loginWithRedirect, logout } = useAuth0();
// 必要な機能をインポート
console.log(user);
return (
<div className='App'>
<div style={{ padding: '20px' }}>
<h2>ログインボタン</h2>
<button onClick={() => loginWithRedirect()}>ログイン</button>
<h2>ログアウトボタン</h2>
<button onClick={() => logout()}>ログアウト</button>
<h2>ログイン状態</h2>
{isAuthenticated ? <p>{user.name}</p> : <p> ログアウト</p>}
</div>
</div>
);
}
export default App;
長かったですね!これでログイン処理ができます。
loginWithRedirect
でログインができます。logout
でログアウトします。isAuthenticated
にはログインしているか、していないかがboolean
で入っています。
user
にはログインしたユーザーの情報が入っています。
ここまで、読んでいただきありがとうございました!
分かりにくい、または間違っているところあれば連絡いただければと思います。
何か連絡をしたい際は以下 SNS、メールでお願いいたします。
Twitter: https://twitter.com/naka_ryo_z