CognitoのユーザープールにSignUpしているユーザーに対して、Facebookなどのidp認証を紐づけることは可能でしょうか?
実現したいこと
- ユーザープールへ電話番号認証でサインアップしておく
- OAuthでIDPへ認証処理
- ログイン済みのユーザーへIDPアカウントを紐付ける(投稿連携、シングルサインオンできるなど)
FacebookへのOAuth処理
javascript
1import {Auth} from 'aws-amplify' 2async function facebookAuth() { 3 const createScript = async () => { 4 return new Promise(resolve => { 5 window.fbAsyncInit = function () { 6 FB.init({ 7 appId: 'XXXXXX', 8 cookie: true, 9 xfbml: true, 10 version: 'v2.11' 11 }); 12 resolve() 13 }; 14 const script = document.createElement('script'); 15 script.src = 'https://connect.facebook.net/en_US/sdk.js'; 16 script.async = true; 17 document.body.appendChild(script); 18 }) 19 } 20 const getAWSCredentials = async (response) => { 21 const {accessToken, expiresIn} = response; 22 const date = new Date(); 23 const expires_at = expiresIn * 1000 + date.getTime(); 24 if (!accessToken) return; 25 const fb = window.FB; 26 fb.api('/me', {fields: 'name,email'}, async response => { 27 const user = { // emailとnameは取得できています 28 name: response.name, 29 email: response.email 30 }; 31 await Auth.federatedSignIn( // ここが疎通せず、Cognitoへも何も反映されません。この関数は使い方間違っていますでしょうか? 32 "facebook", 33 {token: accessToken, expires_at}, 34 user 35 ); 36 }); 37 } 38 const signIn = () => { 39 const fb = window.FB; 40 fb.getLoginStatus(response => { 41 if (response.status === 'connected') { 42 getAWSCredentials(response.authResponse); 43 return; 44 } 45 fb.login( 46 response => { 47 if (!response || !response.authResponse) return; 48 getAWSCredentials(response.authResponse); 49 }, 50 { 51 scope: 'public_profile,email' 52 } 53 ); 54 }); 55 } 56 if (!window.FB) await createScript(); 57 signIn(); 58 }
エラー内容(ブラウザのコンソールログより)
console
1AuthClass - There is already a signed in user: {"id":"ap-northeast-1:XXXXX-XXXX-XXXX-XXXX-XXXXX","name":"user name","email":"user@example.com"} in your app. 2You should not call Auth.federatedSignIn method again as it may cause unexpected behavior.
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。