<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <h1 style="text-align: center;">Facebook Login/Signup FirebaseUI Tests</h1> <!--Have created google button using existing UI CSS styles and SVG icon file--> <div id="firebaseui-auth-container"></div> <div id="loader">Loading...</div> <title>Log in</title> <!-- update the version number as needed --> <link type="text/css" rel="stylesheet" href="https://cdn.firebase.com/libs/firebaseui/3.5.2/firebaseui.css" /> <style media="screen"> body { background: #ECEFF1; color: rgba(0, 0, 0, 0.87); font-family: Roboto, Helvetica, Arial, sans-serif; margin: 0; padding: 0; } #message { background: white; max-width: 360px; margin: 100px auto 16px; padding: 32px 24px; border-radius: 3px; } #message h2 { color: #ffa100; font-weight: bold; font-size: 16px; margin: 0 0 8px; } #message h1 { font-size: 22px; font-weight: 300; color: rgba(0, 0, 0, 0.6); margin: 0 0 16px; } #message p { line-height: 140%; margin: 16px 0 24px; font-size: 14px; } #message a { display: block; text-align: center; background: #039be5; text-transform: uppercase; text-decoration: none; color: white; padding: 16px; border-radius: 4px; } #message, #message a { box-shadow: 0 1px 3px rgba(0, 0, 0, 0.12), 0 1px 2px rgba(0, 0, 0, 0.24); } #load { color: rgba(0, 0, 0, 0.4); text-align: center; font-size: 13px; } @media (max-width: 600px) { body, #message { margin-top: 0; background: white; box-shadow: none; } body { border-top: 16px solid #ffa100; } } </style> </head> <body> <script src="/__/firebase/7.21.1/firebase-app.js"></script> <!-- include only the Firebase features as you need --> <script src="/__/firebase/7.21.1/firebase-auth.js"></script> <script src="/__/firebase/7.21.1/firebase-database.js"></script> <script src="/__/firebase/7.21.1/firebase-messaging.js"></script> <script src="/__/firebase/7.21.1/firebase-storage.js"></script> <!-- initialize the SDK after all desired features are loaded --> <script src="/__/firebase/init.js"></script> <script src="https://cdn.firebase.com/libs/firebaseui/3.5.2/firebaseui.js"></script> <script src="https://thunkable.github.io/webviewer-extension/thunkableWebviewerExtension.js" type="text/javascript"></script> <script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/2.0.0/jquery.min.js"></script> <script> let pw = ""//password variable to pass to Thunkuable login block along with email $(document).ready(function () {//listens for and gets password input field if password is selected as a provider. const elementToObserve = document.getElementById("firebaseui-auth-container") const observer = new MutationObserver(function () {//observer function let passinput = document.getElementsByName('password')[0]//Signin Password input field let passinput2 = document.getElementsByName('newPassword')[0]//Signup input password field //console.log(passinput2) if (passinput) { passinput.addEventListener('input', updateValue);//'input' option works best for async reasons of loading global pw variable function updateValue(e) { pw = e.target.value; } } if (passinput2) { passinput2.addEventListener('input', updateValue2); function updateValue2(e) { pw = e.target.value; } } }); observer.observe(elementToObserve, { subtree: true, childList: true }); }) var ui = new firebaseui.auth.AuthUI(firebase.auth()); var uiConfig = { callbacks: { signInSuccessWithAuthResult: function (authResult, redirectUrl) { ProcessResults(authResult)//This is our function below return false; }, uiShown: function () { // The widget is rendered. // Hide the loader. document.getElementById('loader').style.display = 'none'; //this causes null error } }, signInSuccessUrl: '<url-to-redirect-to-on-success>', signInOptions: [ { provider: firebase.auth.FacebookAuthProvider.PROVIDER_ID, scopes: [ 'instagram_basic',//requires Facebook app review 'user_link', 'public_profile', 'email'//This is the one we need and it is provided by default ], //customParameters: { // Forces password re-entry. // auth_type: 'reauthenticate' // } }, // firebase.auth.TwitterAuthProvider.PROVIDER_ID, // Twitter does not support scopes. firebase.auth.EmailAuthProvider.PROVIDER_ID, // Other providers don't need to be given as object. //firebase.auth.PhoneAuthProvider.PROVIDER_ID, //firebase.auth.GoogleAuthProvider.PROVIDER_ID// Google won't work in web viewers ], // Terms of service url. tosUrl: '<your-tos-url>', // Privacy policy url. privacyPolicyUrl: '<your-privacy-policy-url>' }; ui.start('#firebaseui-auth-container', uiConfig);//load firebaseui function ProcessResults(result) { console.log(result) if (result.additionalUserInfo.isNewUser === true) {//First Time Signup: Link Thunkable email login, create User database node and pass results to nodeJS if (result.additionalUserInfo.providerId !== "password") {//can't link email type accounts to email type account pw = result.user.refreshToken//this could also be a random generated or short access lived token pw = pw.slice(pw.length - 8, pw.length)//create a password as last 8 characters of Refresh token var credential = firebase.auth.EmailAuthProvider.credential(result.user.email, pw);//this is what Thunkable will use to log in firebase.auth().currentUser.linkWithCredential(credential)//link the facebook account with email/password credentials .then(async function (usercred) { let user = usercred.user; console.log("Account linking success", user); ThunkableWebviewerExtension.postMessage(`success:${result.user.uid},${result.user.email},${pw}`) }).catch(function (error) { console.log("Account linking error", error); ThunkableWebviewerExtension.postMessage(`error:${error}`) }); } else { ThunkableWebviewerExtension.postMessage(`success:${result.user.uid},${result.user.email},${pw}`) }//pw is loaded from observer function } else {//if existing user (sign in) then update the account with the new password of the linked auth and pass it to Thunkable if (result.additionalUserInfo.providerId !== "password") { let user = firebase.auth().currentUser; user.updatePassword(pw).then(() => {// Update successful. //console.log(`${result.user.uid},${result.user.email},${pw}`) ThunkableWebviewerExtension.postMessage(`success:${result.user.uid},${result.user.email},${pw}`) }, (error) => { console.error(error) ThunkableWebviewerExtension.postMessage(`error:${error}`) }); } else { ThunkableWebviewerExtension.postMessage(`success:${result.user.uid},${result.user.email},${pw}`) } } } </script> </body> </html>