å½ç¤¾ã®æ°ããã·ã³ã°ã«ãã¼ã¸ã¢ããªã±ã¼ã·ã§ã³ï¼SPAï¼ç¨ã®JavaScript SDKãauth0-spa-jsã®ãªãªã¼ã¹ãçºè¡¨ããã¦ããã ãã¾ãã
SDKãå·æ°ããçç±
ããæ°å¹´ã
ã©ã¤ãã©ãªã¯å½ç¤¾ã®ããã©ã«ãã®ãã©ã¦ã¶ãã¼ã¹SDKã¨ãã¦ãå½ç¤¾ã®è£½åããã³æåã«ããã¦éè¦ãªå½¹å²ãæ
ã£ã¦ãã¾ãããé±éãã¦ã³ãã¼ãæ°ã¯10ä¸ä»¥ä¸ãæ°ããAuth0ãã使ãã®ã»ã¼ãã¹ã¦ã®ã客æ§ã«æ§ã
ãªç¨éã§ä½¿ç¨ããã¦ãã¾ããauth0.js
ãã®éã«ãå½ç¤¾ã§ã¯ã³ã¢è£½ååãã«æ°ã ã®æ©è½ãéçºãã¦ãã¾ããããã©ãããã©ã¼ã ã®é²åã«ä¼´ãã
auth0.js
ã®ãµã¤ãºã¨æ©è½æ§ãåä¸ãã¦ãã¾ãããauth0.js
ã¯ãå¤ç¨®å¤æ§ãªç¶æ³ã«å¯¾å¿ã§ãã極ãã¦å¼·åãªSDKã§ããããã®å¤æ©è½æ§ããã«ããã£ã¦ä¸ä¾¿ã«ãªã£ã¦ãã¾ããå½ç¤¾ã§ã¯åºæ¬ã«ç«ã¡è¿ããéçºè ãå®è£ ããæãä¸è¬çãªã·ããªãªãèæ ®ããã¦ã§ããã©ãããã©ã¼ã SDKã¯ã©ã®ããã«æ©è½ãã¹ãããèãç´ãã¾ããããã®æ°ããSDKã«ã¯ã以ä¸ã®ç¹å¾´ãããã¾ãã
- å½ç¤¾ãèªããã°ã¤ã³æ©è½ã§ããã¦ããã¼ãµã«ãã°ã¤ã³ãçµ±å
- ã·ã³ã°ã«ãã¼ã¸ã¢ããªã±ã¼ã·ã§ã³ã¸ã®çµ±åãã¯ããã«ç°¡åã«ãªããå¿ è¦ãªã³ã¼ãæ°ãæ¸å°
- æ¨æºããããã³ã«ããéçºè ã解æ¾
- ã°ã©ã³ãããã®ä»ã®ãããã³ã«è©³ç´°ã®æå®ããã¼ã¯ã³æå¹æéã¨æ´æ°ã®ç®¡çããã¼ã¯ã³ã®ä¿åããã£ãã·ã¥ã¨ãã£ãç ©ãããä½æ¥ããéçºè ã解æ¾
- æ¥çããã³ãµã¼ãã¹ã®ãã¹ããã©ã¯ãã£ã¹ã«å¾ããéçºè ãã»ãã¥ãªãã£ã®è½ã¨ãç©´ããä¿è·
- gzipå§ç¸®ã«ããç´7KBã¾ã§è»½éå
å½ç¤¾ã§ã¯ããããã®å¤æ´ã«èªä¿¡ãæã£ã¦ãããå½ç¤¾ã®é¡§å®¢ãéçºè ã³ãã¥ããã£ãããã®æ°ããSDKã®ä½¿ããããã¯ãã¡ãããå¤æ©è½ãã¤å®å ¨ã§ããç¹ãä½æãã¦ããã ããã¨ä¿¡ãã¦ãã¾ãã
âSPAã®å®å ¨ãä¿ã¤ããã«ã@auth0ã«auth0-spa-jsã¨ããæ°ããSDKãå®è£ ããã¾ããããã²ãã§ãã¯ãã¦ã¿ã¦ãã ããï¼â
ããããã¤ã¼ããã
auth0-spa-js
ã®ä½¿ç¨æ¨å¥¨ç¶æ³ï¼ããã³éæ¨å¥¨ç¶æ³ï¼
auth0-spa-js
æ°ããSDKã¯ãæ¥çã®ãã¹ããã©ã¯ãã£ã¹ãæ´»ç¨ãå®å ¨æ§ãä¿ã¤ãããSPAã§ä½¿ç¨ããããè¨è¨ããã¦ãã¾ãã
OAuth2ã¯ã¼ãã³ã°ã°ã«ã¼ãã¯ãã·ã³ã°ã«ãã¼ã¸ã¢ããªã±ã¼ã·ã§ã³ããAPIãèµ·åããããã®OAuth2ã®ä½¿ç¨æ¹æ³ã«é¢ããææ°ã®ä¸è¬åããã¹ããã©ã¯ãã£ã¹ããã¥ã¡ã³ããå ¬éãã¾ãããä»å¾ã¯ãå¾æ¥ã®OAuth2ä»æ§æ¸ã«è¨è¼ãããimplicit grantã使ç¨ããã®ã§ã¯ãªããProof Key for Code Exchangeï¼PKCEï¼ã«ããèªå¯ã³ã¼ãä»ä¸ã使ç¨ãããã¨ãæ¨å¥¨ãã¾ãã詳ããã¯ãå½ç¤¾ã®éçºä¸»ä»»Vittorio Bertocciã®ããã°è¨äºãã覧ãã ããã
ãã®æ°ããJavaScript SDKã§ã¯ãèªè¨¼ç¨ã«PKCEã«ããèªå¯ã³ã¼ãä»ä¸ãå®è£ ãã¾ããããããã£ã¦ããã®æ°ããã©ã¤ãã©ãªã使ç¨ãããã¨ã§ãã·ã³ã°ã«ãã¼ã¸ã¢ããªã±ã¼ã·ã§ã³ã«ãããã»ãã¥ãªãã£ã«é¢ããææ°ã®æ¥çãã¹ããã©ã¯ãã£ã¹ã«å¾ããã¨ã«ãªãã¾ãã
auth0.js
ã®ãµãã¼ãã¯ç¶ç¶ãã¾ãã®ã§ããå®å¿ãã ãããå¼ãç¶ãåè¾¼ã¿åãã°ã¤ã³ã使ç¨ããããmanagementAPI ã¾ãã¯authenticationAPIãå¼ã³åºãå¿
è¦ããã£ããããå ´åãauth0.js
ããã®ã¾ã¾ã使ç¨ãã ãããSPAã§ã¦ããã¼ãµã«ãã°ã¤ã³ã使ç¨ããå ´åã¯ãauth0-spa-js
ã«åãæ¿ãããã¨ãæ¨å¥¨ãã¾ããAuth0 SPA JS SDKã®ä½¿ãæ¹
æ°ããSDKã使ãå§ããã«ã¯ã©ãããã°ããã§ããããï¼ä¸è¬çãªJavaScriptåãã®æé ããç´¹ä»ãã¾ãã®ã§ãã客æ§ã®ãã¬ã¼ã ã¯ã¼ã¯ã«åããã¦å¿ç¨ãã¦ãã ããã
ã¤ã³ã¹ãã¼ã«ãã
æ°ããSDKã使ç¨ããã«ã¯ãæåã«npmããã¤ã³ã¹ãã¼ã«ãã¾ãã
npm install @auth0/auth0-spa-js
ãããã¯ãå½ç¤¾ã®CDNã使ç¨ãã¦ããã¸ã§ã¯ãã«ã¤ã³ã¯ã«ã¼ããããã¨ãã§ãã¾ãã
<script src="https://cdn.auth0.com/js/auth0-spa-js/1.0/auth0-spa-js.production.js"></script>
ã¯ã©ã¤ã¢ã³ããä½æãã
auth0-spa-js
ãããã¸ã§ã¯ãã«è¿½å ããããã¢ããªã±ã¼ã·ã§ã³ã§Auth0ã¯ã©ã¤ã¢ã³ãã®ã¤ã³ã¹ã¿ã³ã¹ãä½æããå¿
è¦ãããã¾ãã1ã¯ã©ã¤ã¢ã³ã1ã¤ã³ã¹ã¿ã³ã¹ã®ã¿ãä½æããã®ãçæ³çã§ãããã®ä½æ¥ã¯ãã¢ããªã±ã¼ã·ã§ã³ãã¬ã³ããªã³ã°ã¾ãã¯åæåããåã«å®è¡ãã¦ãã ãããasync/awaitã使ç¨ããå ´åã®è¨è¿°ï¼
//with async/await const auth0 = await createAuth0Client({ domain: '<AUTH0_DOMAIN>', client_id: '<AUTH0_CLIENT_ID>' });
Promiseã使ç¨ããå ´åã®è¨è¿°ï¼
//with promises createAuth0Client({ domain: '<AUTH0_DOMAIN>', client_id: '<AUTH0_CLIENT_ID>' }).then(auth0 => { //... });
ãã°ã¤ã³ãã
ã¢ããªã±ã¼ã·ã§ã³ã«ãã°ã¤ã³ããæ©è½ã¯ãç°¡åã«è¿½å ã§ãã¾ãã次ã®ãã¿ã³ãè¨å®ãã¾ãã
<button id="login">ã¯ãªãã¯ãã¦ãã°ã¤ã³ãã</button>
ã¯ãªãã¯ãã³ãã©ã追å ãã¦ããã
ã¡ã½ãããå¼ã³åºãã¾ããloginWithRedirect()
document.getElementById('login').addEventListener('click', () => { return auth0.loginWithRedirect(); });
Auth0ã«ããèªè¨¼å¾ãã¦ã¼ã¶ã¼ãã¢ããªã«ãªãã¤ã¬ã¯ããããããã¢ããªå´ã§
ãå¼ã³åºãå¿
è¦ãããã¾ãã handleRedirectCallback()
await auth0.handleRedirectCallback();
ããã«ãããAuth0ããã®çµæ解æããã¼ã¯ã³ã®ä¿åãã»ãã·ã§ã³ã®è¨å®ãå®è¡ããã¾ããå¿ è¦ã«å¿ãã¦ãã¦ã¼ã¶ã¼ã¾ãã¯ãã¼ã¯ã³ãåå¾ã§ããããã«ãªãã¾ãã
const user = await auth0.getUser(); const token = await auth0.getTokenSilently();
APIãå¼ã³åºã
SDKã使ç¨ãã¦ãã¼ã¯ã³ãèªåçã«åå¾ãããã®ãã¼ã¯ã³ãAPIã¸ã®å¼ã³åºãã§ä½¿ç¨ãããã¨ãã§ãã¾ãã
次ã®ãã¿ã³ãè¨å®ãã¾ãã
<button id="call-api">APIãå¼ã³åºã</button>
click handlerã追å ãã
ãå¼ã³åºãã¦ãããè¿ããããã¼ã¯ã³ãAPIã³ã¼ã«ã§ä½¿ç¨ãã¾ããgetTokenSilently()
async/awaitã使ç¨ããå ´åã®è¨è¿°ï¼
//with async/await document.getElementById('call-api').addEventListener('click', async () => { const accessToken = await auth0.getTokenSilently(); const result = await fetch('https://myapi.com', { method: 'GET', headers: { Authorization: `Bearer ${accessToken}` } }); const data = await result.json(); console.log(data); });
Promiseã使ç¨ããå ´åã®è¨è¿°ï¼
//with promises document.getElementById('call-api').addEventListener('click', () => { auth0 .getTokenSilently() .then(accessToken => fetch('https://myapi.com', { method: 'GET', headers: { Authorization: `Bearer ${accessToken}` } }) ) .then(result => result.json()) .then(data => { console.log(data); }); });
æå¹ãªãã¼ã¯ã³ãä¿åããã¦ããå ´åã
getTokenSilently
ããã®ãã¼ã¯ã³ãè¿ãã¾ããä¿åããã¦ããªãå ´åã¯ãå¼æ°ã¨ãã¦å
¥åããããã©ã¡ã¼ã¿ã使ç¨ãã¦/authorize
URLã«ããiframeãéããããã¼ã¯ã³ãè¿ããã¾ãããã°ã¢ã¦ããã
æå¾ã«ãã¢ããªã±ã¼ã·ã§ã³ãããã°ã¢ã¦ãããã«ã¯ãevent handlerããã°ã¢ã¦ããã¿ã³ã«è¿½å ããAuth0ã®
ã¡ã½ãããå¼ã³åºãã¾ããlogout()
ãã¿ã³ã®è¨è¿°ï¼
<button id="logout">ãã°ã¢ã¦ããã</button>
ã¯ãªãã¯ãã³ãã©ã¨
logout()
ã¸ã®å¼ã³åºãã®è¨è¿°ï¼document.getElementById('logout').addEventListener('click', () => { auth0.logout(); });
SDKã®ä¸èº«
éçºè ã®å¤ãã¯ï¼èªåãå«ãï¼ä¸èº«ãããããªããã®ã«å¯¾ãã¦æ éã«ãªãã¨æãã¾ãã®ã§ãæ°ããSDKã®èå¾ã«ãããããã³ã«ã«ã¤ãã¦ç°¡åã«ã説æãã¾ãããã
ã客æ§ãå®è£ ã®ç´°ããé¨åã«é ãæ©ã¾ãããã¨ããªãããã«ãæ°ããSDKã§ã¯ãã®ãããªè©³ç´°ãªé¨åãããã¦å ¨ã¦æ½è±¡åãã¾ãããã
auth0-spa-js
ã¯OAuth 2.0ä»æ§ã«æºæ ãã¦ããã¨èãã°ãã¢ã¤ãã³ãã£ãã£ã®ã¼ã¯ãªæ¹ã
ã«ãæºè¶³ãã¦ããã ããã¨æãã¾ãã
ã¯ãPKCEã«ããèªå¯ã³ã¼ãã使ç¨loginWithRedirect
ã¯ãPKCE +loginWithPopup
ã«ããèªå¯ã³ã¼ãã使ç¨web_message
ã¯ãPKCE +getTokenSilently
ã«ããèªå¯ã³ã¼ãã使ç¨web_message
Auth0ã¯ãå½ç¤¾ã®ã»ãã¥ãªãã£ã«é¢ãããã¹ããã©ã¯ãã£ã¹ã¸ã®åãçµã¿ãçæ¯ã«æ¡ç¨ãã¦ãã¾ããç ©ãããä½æ¥ã¯å½ç¤¾ããã¹ã¦å¼ãåãã¾ããã®ã§ãã客æ§ã¯å®å¿ãã¦ã使ç¨ãã ããã
ä»å¾ã®å±æ
auth0-spa-js
ã®ä½¿ç¨ã«é¢ãã詳細ã¯ãAuth0ã·ã³ã°ã«ãã¼ã¸ã¢ããªã±ã¼ã·ã§ã³SDKç´¹ä»ããã¥ã¡ã³ãããªãã¸ããªãSDKã®åæ±èª¬ææ¸ãåç
§ãã¦ãã ãããã¾ããReactãAngularãªã©ã®ä¸è¬çãªããã³ãã¨ã³ããã¬ã¼ã ã¯ã¼ã¯åãã«é ã追ã£ã¦çµ±åæé ã解説ããã¯ã¤ãã¯ã¹ã¿ã¼ãã¬ã¤ãããç¨æãã¦ãã¾ããå½ç¤¾ãèªä¿¡ãæã£ã¦ãéããããã®æ°ããSDKãæ¯éãå©ç¨ãã ãããããã¦ãéçºè
ã³ãã¥ããã£ããã®ãã£ã¼ãããã¯ããå¾
ã¡ãã¦ããã¾ããAuth0 ã«ã¤ãã¦
Auth0 ã¯ãã¢ããªã±ã¼ã·ã§ã³ãã«ãã¼ã®ããã«ã¤ããããæåã®ã¢ã¤ãã³ãã£ãã£ç®¡çãã©ãããã©ã¼ã ã§ãããã«ã¹ã¿ã ãã«ãã¢ããªã±ã¼ã·ã§ã³ã«å¿ è¦ã¨ãããå¯ä¸ã®ã¢ã¤ãã³ãã£ãã£ã½ãªã¥ã¼ã·ã§ã³ã§ããä¸çä¸ã®ã¢ã¤ãã³ãã£ãã£ãå®ããã¤ããã¼ã¿ã¼ãã¤ããã¼ã·ã§ã³ãèµ·ãããããã«ããã¨ããããã·ã§ã³ã®ãã¨ãAuth0 ã¯ã·ã³ãã«ã§ãæ¡å¼µæ§ã®ãããã¹ã±ã¼ã©ãã«ãªãã©ãããã©ã¼ã ãæä¾ãããããããªã¼ãã£ã¨ã³ã¹ã®ããã«ãããããã¢ããªã±ã¼ã·ã§ã³ã®ã¢ã¤ãã³ãã£ãã£ãå®ãã¾ããAuth0 ã¯æ¯æ¥ 1 åå以ä¸ã®ãã°ã¤ã³ãä¿è·ããæ³äººä¼æ¥ãä¿¡é ¼ãããã¨ã¬ã¬ã³ããªãã¸ã¿ã«ã¨ã¯ã¹ããªã¨ã³ã¹ãä¸çä¸ã®é¡§å®¢ã«æä¾ã§ããããã«ãã¾ãã
ãã詳ããæ å ±ã«é¢ãã¦ãhttps://auth0.com/jp/ãããã¯@auth0_jp on Twitterãã覧ãã ããã
About the author

Sam Julien
Director of Developer Relations