I. Introduction
In this tutorial, I will demonstrate how to perform Facebook Login in Vue 3 with a sample application that allows you to log in with Facebook and view / update / delete the registered account in the Vue app based on a post. written by Jason.
The first time you log in with Facebook, an account will be registered in the Vue app with your Facebook id so that it can identify you when you log back in with Facebook. An account created with a name from your Facebook account and an extraInfo field with some default text, both name and additional information can be updated in the app, but updating account details only changes. them in the app without having an effect on Facebook.
II. Create Facebook App
My application has 3 main routers to perform login function, display a list of all accounts and edit accounts.
Login (/ login) – contains a Facebook login button that activates authentication with Facebook and registration / authentication with Vue.js. Home (/) – shows a list of all accounts in the Vue app with buttons to edit or delete any of them. Edit Account (/ edit /: id) – contains a form for updating account details.
1. Create App Fakebook
First we need the Facebook App for Facebook Login To integrate Facebook Login into a website or app, you need to create a Facebook App at https://developers.facebook.com/apps/ and set up your account. Facebook login in the App. Creating the Facebook App will give you the necessary Facebook App ID when initializing Facebook’s JavaScript SDK (FB.init (…)). For more information, see the Facebook Signing documentation at https://developers.facebook.com/docs/facebook-login/web .
After creating a Facebook App you will get an ID used for logging in. For example, here I have the login ID that I created for this tutorial (app ID: 314930319788683). This Facebook application ID you need to add in the dotenv file (/.env). With the name VUE_APP_FACEBOOK_APP_ID or another name, you can choose). To call the ID in vue you can use this way process.env. <Variable name> (eg process.env.VUE_APP_FACEBOOK_APP_ID). If you need more information on how to use environment variables in Vue, see https://cli.vuejs.org/guide/mode-and-env.html#enosystem-variables .
2. Fake API backend
You can simply understand that in order to run the King application we need to call the api to the backend to handle the task, but here we will fake the api backend to allow it to run completely in the browser without an api. backend-less. The pseudo apk contains routes to authenticate and operate the CRUD account, it uses the browser’s local memory to save the data. To disable the fake-backend, simply remove a few lines of code from the main.js file, which I will guide below.
3. Scope of influence when updating
Updating or deleting account information in the Vue 3 app will only change the data saved in the app, it won’t (and can’t) change anything in the linked Facebook account.
4. Authentication flow with Facebook access tokens and JWT tokens
Authentication is done through the access token of Facebook and the token of JWT. Upon successful login to Facebook, the access token is returned back to the Vue 3 app, which is then used to authenticate with the api. The JWT token will expire after 15 minutes and is used for secure access on the API and the Facebook access token is used to re-authenticate with the api to receive a new JWT token or when it expires. The Vue app starts the re-authentication timer for the new JWT token 1 minute before it expires to keep the account logged in we can use apiAuthenticate () method.
III. Run the application.
- Install Node.js and npm from https://nodejs.org
- Download or copy the project’s source code from https://github.com/cornflourblue/vue-3-facebook-login-example
- Install all required npm packages by running npm install from the command line in the project root directory (where package.json is located).
- Start the application in SSL (https) mode by running npm run serve: ssl from the command line in the project root directory, SSL is required for the Facebook SDK to run properly, this will launch the browser with URL https: // localhost: 8080 /. You should see the message Your Connection is not private (or something similar in non-Chrome browsers), which is nothing to worry about just because the Vue development server runs with the certificate SSL. To open the application, click the “Proceed” button and link to the server “localhost”.
IV. Project structure.
1. Structure
Vue-CLI is an NPM package that is installed worldwide to provide vue in the terminal. By using Vue Create, Vue serve it will assist you in building projects easily and quickly.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | <span class="token keyword">public</span> index <span class="token punctuation">.</span> html src _helpers auth <span class="token punctuation">.</span> guard <span class="token punctuation">.</span> js error <span class="token punctuation">.</span> interceptor <span class="token punctuation">.</span> js fake <span class="token operator">-</span> backend <span class="token punctuation">.</span> js init <span class="token operator">-</span> facebook <span class="token operator">-</span> sdk <span class="token punctuation">.</span> js jwt <span class="token punctuation">.</span> interceptor <span class="token punctuation">.</span> js router <span class="token punctuation">.</span> js index <span class="token punctuation">.</span> js _services account <span class="token punctuation">.</span> service <span class="token punctuation">.</span> js index <span class="token punctuation">.</span> js home EditAccount <span class="token punctuation">.</span> vue Home <span class="token punctuation">.</span> vue login Login <span class="token punctuation">.</span> vue App <span class="token punctuation">.</span> vue main <span class="token punctuation">.</span> js styles <span class="token punctuation">.</span> less <span class="token punctuation">.</span> env package <span class="token punctuation">.</span> json |
2. Main Index Html File
Path: /public/index.html The index.html file is the first page loaded by the browser to start everything up. The Vue CLI (with hidden Webpack) packs all the compiled javascript files together and puts them in the body of the index.html page so the browser can load and execute the scripts.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <span class="token operator"><</span> <span class="token operator">!</span> <span class="token constant">DOCTYPE</span> html <span class="token operator">></span> <span class="token operator"><</span> html lang <span class="token operator">=</span> <span class="token double-quoted-string string">"en"</span> <span class="token operator">></span> <span class="token operator"><</span> head <span class="token operator">></span> <span class="token operator"><</span> meta charset <span class="token operator">=</span> <span class="token double-quoted-string string">"utf-8"</span> <span class="token operator">></span> <span class="token operator"><</span> meta http <span class="token operator">-</span> equiv <span class="token operator">=</span> <span class="token double-quoted-string string">"X-UA-Compatible"</span> content <span class="token operator">=</span> <span class="token double-quoted-string string">"IE=edge"</span> <span class="token operator">></span> <span class="token operator"><</span> meta name <span class="token operator">=</span> <span class="token double-quoted-string string">"viewport"</span> content <span class="token operator">=</span> <span class="token double-quoted-string string">"width=device-width,initial-scale=1.0"</span> <span class="token operator">></span> <span class="token operator"><</span> link rel <span class="token operator">=</span> <span class="token double-quoted-string string">"icon"</span> href <span class="token operator">=</span> <span class="token double-quoted-string string">"<%= BASE_URL %>favicon.ico"</span> <span class="token operator">></span> <span class="token operator"><</span> title <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">%</span> <span class="token operator">=</span> htmlWebpackPlugin <span class="token punctuation">.</span> options <span class="token punctuation">.</span> title <span class="token operator">%</span> <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> title <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">!</span> <span class="token operator">--</span> bootstrap <span class="token operator">&</span> font <span class="token operator">-</span> awesome css <span class="token operator">--</span> <span class="token operator">></span> <span class="token operator"><</span> link href <span class="token operator">=</span> <span class="token double-quoted-string string">"//netdna.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css"</span> rel <span class="token operator">=</span> <span class="token double-quoted-string string">"stylesheet"</span> <span class="token operator">/</span> <span class="token operator">></span> <span class="token operator"><</span> link href <span class="token operator">=</span> <span class="token double-quoted-string string">"//cdnjs.cloudflare.com/ajax/libs/font-awesome/4.7.0/css/font-awesome.min.css"</span> rel <span class="token operator">=</span> <span class="token double-quoted-string string">"stylesheet"</span> <span class="token operator">/</span> <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> head <span class="token operator">></span> <span class="token operator"><</span> body <span class="token operator">></span> <span class="token operator"><</span> div id <span class="token operator">=</span> <span class="token double-quoted-string string">"app"</span> <span class="token operator">></span> Loading <span class="token punctuation">.</span> <span class="token punctuation">.</span> <span class="token punctuation">.</span> <span class="token operator"><</span> <span class="token operator">/</span> div <span class="token operator">></span> <span class="token operator"><</span> noscript <span class="token operator">></span> <span class="token operator"><</span> strong <span class="token operator">></span> We <span class="token single-quoted-string string">'re sorry but <%= htmlWebpackPlugin.options.title %> doesn'</span> t work properly without JavaScript enabled <span class="token punctuation">.</span> Please enable it to <span class="token keyword">continue</span> <span class="token punctuation">.</span> <span class="token operator"><</span> <span class="token operator">/</span> strong <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> noscript <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">!</span> <span class="token operator">--</span> built files will be auto injected <span class="token operator">--</span> <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> body <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> html <span class="token operator">></span> |
3. Auth Guard
Path: /src/_helpers/auth.guard.js Auth guard is a Vue Router Navigation Guard that helps prevent unauthenticated users from accessing restricted routes. If the function returns true, the navigation is confirmed and allowed to continue, otherwise if the function returns false, the navigation is canceled.
Vue router guards navigation are attached to routes in the router configuration, these authentication guards are used in router.js to protect home and modify account routes.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | import <span class="token punctuation">{</span> accountService <span class="token punctuation">}</span> from <span class="token single-quoted-string string">'@/_services'</span> <span class="token punctuation">;</span> import <span class="token punctuation">{</span> router <span class="token punctuation">}</span> from <span class="token single-quoted-string string">'@/_helpers'</span> <span class="token punctuation">;</span> export <span class="token keyword">function</span> <span class="token function">authGuard</span> <span class="token punctuation">(</span> to <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">const</span> account <span class="token operator">=</span> accountService <span class="token punctuation">.</span> accountValue <span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> account <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// logged in so return true</span> <span class="token keyword">return</span> <span class="token boolean constant">true</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">// not logged in so redirect to login page with the return url</span> router <span class="token punctuation">.</span> <span class="token function">push</span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> path <span class="token punctuation">:</span> <span class="token single-quoted-string string">'/login'</span> <span class="token punctuation">,</span> query <span class="token punctuation">:</span> <span class="token punctuation">{</span> returnUrl <span class="token punctuation">:</span> to <span class="token punctuation">.</span> fullPath <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token boolean constant">false</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> |
4. Error Interceptor
Path: /src/_helpers/error.interceptor.js
Error Interceptor intercepts http responses from the api to check for any errors. All errors are logged in the dashboard and if there is a 401 Unauthorized or 403 Forbidden response the account will be automatically logged out of the application.
It is implemented as an axios response interceptor, by passing callback functions to axios.interceptors.response.use (), you can intercept responses before they are processed by then () or catch. (). The first callback function intercepts successful responses and the second callback function intercepts error responses. For more information about the axios blocker, see https://github.com/axios/axios#interceptors .
The error blocker is launched on application startup in the main.js file.
5. Fake Backend
Path: /src/_helpers/fake-backend.js
To run a Vue 3 application without the API backend, this example will fake the backend by blocking HTTP requests from the Vue application and returning “fake” responses. This is done by returning fake responses when calling axios requests (get, post, put, delete).
The fake backend is written as a handleRoute () function that checks requests for urls and methods to determine how requests are handled. For fake routes, one of the router functions will be called, and for all other routes, the request is forwarded by calling the axios request function (axios [ original $ {method}
] (url, body ( ))). Below the router functions helper functions are used to return different types of responses and perform small tasks.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 | import axios from <span class="token single-quoted-string string">'axios'</span> <span class="token punctuation">;</span> import <span class="token punctuation">{</span> accountService <span class="token punctuation">}</span> from <span class="token single-quoted-string string">'@/_services'</span> <span class="token punctuation">;</span> <span class="token comment">// array in local storage for accounts</span> <span class="token keyword">const</span> accountsKey <span class="token operator">=</span> <span class="token single-quoted-string string">'vue-3-facebook-login-accounts'</span> <span class="token punctuation">;</span> let accounts <span class="token operator">=</span> <span class="token constant">JSON</span> <span class="token punctuation">.</span> <span class="token function">parse</span> <span class="token punctuation">(</span> localStorage <span class="token punctuation">.</span> <span class="token function">getItem</span> <span class="token punctuation">(</span> accountsKey <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token operator">||</span> <span class="token punctuation">[</span> <span class="token punctuation">]</span> <span class="token punctuation">;</span> export <span class="token keyword">function</span> <span class="token function">fakeBackend</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">const</span> methods <span class="token operator">=</span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'get'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'post'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'put'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'delete'</span> <span class="token punctuation">]</span> <span class="token punctuation">;</span> methods <span class="token punctuation">.</span> <span class="token keyword">forEach</span> <span class="token punctuation">(</span> method <span class="token operator">=</span> <span class="token operator">></span> <span class="token punctuation">{</span> axios <span class="token punctuation">[</span> `original <span class="token variable">$</span> <span class="token punctuation">{</span> method <span class="token punctuation">}</span> ` <span class="token punctuation">]</span> <span class="token operator">=</span> axios <span class="token punctuation">[</span> method <span class="token punctuation">]</span> <span class="token punctuation">;</span> axios <span class="token punctuation">[</span> method <span class="token punctuation">]</span> <span class="token operator">=</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> url <span class="token punctuation">,</span> <span class="token punctuation">.</span> <span class="token punctuation">.</span> <span class="token punctuation">.</span> params <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">Promise</span> <span class="token punctuation">(</span> <span class="token punctuation">(</span> resolve <span class="token punctuation">,</span> reject <span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token function">handleRoute</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">function</span> <span class="token function">handleRoute</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">switch</span> <span class="token punctuation">(</span> <span class="token boolean constant">true</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">case</span> url <span class="token punctuation">.</span> <span class="token function">endsWith</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'/accounts/authenticate'</span> <span class="token punctuation">)</span> <span class="token operator">&&</span> method <span class="token operator">===</span> <span class="token single-quoted-string string">'post'</span> <span class="token punctuation">:</span> <span class="token keyword">return</span> <span class="token function">authenticate</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">case</span> url <span class="token punctuation">.</span> <span class="token function">endsWith</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'/accounts'</span> <span class="token punctuation">)</span> <span class="token operator">&&</span> method <span class="token operator">===</span> <span class="token single-quoted-string string">'get'</span> <span class="token punctuation">:</span> <span class="token keyword">return</span> <span class="token function">getAccounts</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">case</span> url <span class="token punctuation">.</span> <span class="token function">match</span> <span class="token punctuation">(</span> <span class="token operator">/</span> <span class="token operator">/</span> accounts <span class="token operator">/</span> <span class="token package">d</span> <span class="token operator">+</span> $ <span class="token operator">/</span> <span class="token punctuation">)</span> <span class="token operator">&&</span> method <span class="token operator">===</span> <span class="token single-quoted-string string">'get'</span> <span class="token punctuation">:</span> <span class="token keyword">return</span> <span class="token function">getAccountById</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">case</span> url <span class="token punctuation">.</span> <span class="token function">match</span> <span class="token punctuation">(</span> <span class="token operator">/</span> <span class="token operator">/</span> accounts <span class="token operator">/</span> <span class="token package">d</span> <span class="token operator">+</span> $ <span class="token operator">/</span> <span class="token punctuation">)</span> <span class="token operator">&&</span> method <span class="token operator">===</span> <span class="token single-quoted-string string">'put'</span> <span class="token punctuation">:</span> <span class="token keyword">return</span> <span class="token function">updateAccount</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">case</span> url <span class="token punctuation">.</span> <span class="token function">match</span> <span class="token punctuation">(</span> <span class="token operator">/</span> <span class="token operator">/</span> accounts <span class="token operator">/</span> <span class="token package">d</span> <span class="token operator">+</span> $ <span class="token operator">/</span> <span class="token punctuation">)</span> <span class="token operator">&&</span> method <span class="token operator">===</span> <span class="token single-quoted-string string">'delete'</span> <span class="token punctuation">:</span> <span class="token keyword">return</span> <span class="token function">deleteAccount</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">default</span> <span class="token punctuation">:</span> <span class="token comment">// pass through any requests not handled above</span> <span class="token keyword">return</span> axios <span class="token punctuation">[</span> `original <span class="token variable">$</span> <span class="token punctuation">{</span> method <span class="token punctuation">}</span> ` <span class="token punctuation">]</span> <span class="token punctuation">(</span> url <span class="token punctuation">,</span> <span class="token function">body</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">then</span> <span class="token punctuation">(</span> response <span class="token operator">=</span> <span class="token operator">></span> <span class="token function">resolve</span> <span class="token punctuation">(</span> response <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token keyword">catch</span> <span class="token punctuation">(</span> error <span class="token operator">=</span> <span class="token operator">></span> <span class="token function">reject</span> <span class="token punctuation">(</span> error <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token comment">// route functions</span> <span class="token keyword">function</span> <span class="token function">authenticate</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">const</span> <span class="token punctuation">{</span> accessToken <span class="token punctuation">}</span> <span class="token operator">=</span> <span class="token function">body</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> axios <span class="token punctuation">.</span> <span class="token function">get</span> <span class="token punctuation">(</span> `https <span class="token punctuation">:</span> <span class="token comment">//graph.facebook.com/v8.0/me?access_token=${accessToken}`)</span> <span class="token punctuation">.</span> <span class="token function">then</span> <span class="token punctuation">(</span> response <span class="token operator">=</span> <span class="token operator">></span> <span class="token punctuation">{</span> <span class="token keyword">const</span> <span class="token punctuation">{</span> data <span class="token punctuation">}</span> <span class="token operator">=</span> response <span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> data <span class="token punctuation">.</span> error <span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token function">unauthorized</span> <span class="token punctuation">(</span> data <span class="token punctuation">.</span> error <span class="token punctuation">.</span> message <span class="token punctuation">)</span> <span class="token punctuation">;</span> let account <span class="token operator">=</span> accounts <span class="token punctuation">.</span> <span class="token function">find</span> <span class="token punctuation">(</span> x <span class="token operator">=</span> <span class="token operator">></span> x <span class="token punctuation">.</span> facebookId <span class="token operator">===</span> data <span class="token punctuation">.</span> id <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> <span class="token operator">!</span> account <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// create new account if first time logging in</span> account <span class="token operator">=</span> <span class="token punctuation">{</span> id <span class="token punctuation">:</span> <span class="token function">newAccountId</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> facebookId <span class="token punctuation">:</span> data <span class="token punctuation">.</span> id <span class="token punctuation">,</span> name <span class="token punctuation">:</span> data <span class="token punctuation">.</span> name <span class="token punctuation">,</span> extraInfo <span class="token punctuation">:</span> `This is some extra info about <span class="token variable">$</span> <span class="token punctuation">{</span> data <span class="token punctuation">.</span> name <span class="token punctuation">}</span> that is saved in the <span class="token constant">API</span> ` <span class="token punctuation">}</span> accounts <span class="token punctuation">.</span> <span class="token function">push</span> <span class="token punctuation">(</span> account <span class="token punctuation">)</span> <span class="token punctuation">;</span> localStorage <span class="token punctuation">.</span> <span class="token function">setItem</span> <span class="token punctuation">(</span> accountsKey <span class="token punctuation">,</span> <span class="token constant">JSON</span> <span class="token punctuation">.</span> <span class="token function">stringify</span> <span class="token punctuation">(</span> accounts <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> <span class="token function">ok</span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> <span class="token punctuation">.</span> <span class="token punctuation">.</span> <span class="token punctuation">.</span> account <span class="token punctuation">,</span> token <span class="token punctuation">:</span> <span class="token function">generateJwtToken</span> <span class="token punctuation">(</span> account <span class="token punctuation">)</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">function</span> <span class="token function">getAccounts</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> <span class="token operator">!</span> <span class="token function">isLoggedIn</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token function">unauthorized</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token function">ok</span> <span class="token punctuation">(</span> accounts <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">function</span> <span class="token function">getAccountById</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> <span class="token operator">!</span> <span class="token function">isLoggedIn</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token function">unauthorized</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> let account <span class="token operator">=</span> accounts <span class="token punctuation">.</span> <span class="token function">find</span> <span class="token punctuation">(</span> x <span class="token operator">=</span> <span class="token operator">></span> x <span class="token punctuation">.</span> id <span class="token operator">===</span> <span class="token function">idFromUrl</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token function">ok</span> <span class="token punctuation">(</span> account <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">function</span> <span class="token function">updateAccount</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> <span class="token operator">!</span> <span class="token function">isLoggedIn</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token function">unauthorized</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> let params <span class="token operator">=</span> <span class="token function">body</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> let account <span class="token operator">=</span> accounts <span class="token punctuation">.</span> <span class="token function">find</span> <span class="token punctuation">(</span> x <span class="token operator">=</span> <span class="token operator">></span> x <span class="token punctuation">.</span> id <span class="token operator">===</span> <span class="token function">idFromUrl</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// update and save account</span> Object <span class="token punctuation">.</span> <span class="token function">assign</span> <span class="token punctuation">(</span> account <span class="token punctuation">,</span> params <span class="token punctuation">)</span> <span class="token punctuation">;</span> localStorage <span class="token punctuation">.</span> <span class="token function">setItem</span> <span class="token punctuation">(</span> accountsKey <span class="token punctuation">,</span> <span class="token constant">JSON</span> <span class="token punctuation">.</span> <span class="token function">stringify</span> <span class="token punctuation">(</span> accounts <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token function">ok</span> <span class="token punctuation">(</span> account <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">function</span> <span class="token function">deleteAccount</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> <span class="token operator">!</span> <span class="token function">isLoggedIn</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token keyword">return</span> <span class="token function">unauthorized</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// delete account then save</span> accounts <span class="token operator">=</span> accounts <span class="token punctuation">.</span> <span class="token function">filter</span> <span class="token punctuation">(</span> x <span class="token operator">=</span> <span class="token operator">></span> x <span class="token punctuation">.</span> id <span class="token operator">!==</span> <span class="token function">idFromUrl</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> localStorage <span class="token punctuation">.</span> <span class="token function">setItem</span> <span class="token punctuation">(</span> accountsKey <span class="token punctuation">,</span> <span class="token constant">JSON</span> <span class="token punctuation">.</span> <span class="token function">stringify</span> <span class="token punctuation">(</span> accounts <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token function">ok</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token comment">// helper functions</span> <span class="token keyword">function</span> <span class="token function">ok</span> <span class="token punctuation">(</span> body <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// wrap in timeout to simulate server api call</span> <span class="token function">setTimeout</span> <span class="token punctuation">(</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token function">resolve</span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> status <span class="token punctuation">:</span> <span class="token number">200</span> <span class="token punctuation">,</span> data <span class="token punctuation">:</span> body <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> <span class="token number">500</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">function</span> <span class="token function">unauthorized</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token function">setTimeout</span> <span class="token punctuation">(</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token punctuation">{</span> <span class="token keyword">const</span> response <span class="token operator">=</span> <span class="token punctuation">{</span> status <span class="token punctuation">:</span> <span class="token number">401</span> <span class="token punctuation">,</span> data <span class="token punctuation">:</span> <span class="token punctuation">{</span> message <span class="token punctuation">:</span> <span class="token single-quoted-string string">'Unauthorized'</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">;</span> <span class="token function">reject</span> <span class="token punctuation">(</span> response <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// manually trigger error interceptor</span> <span class="token keyword">const</span> errorInterceptor <span class="token operator">=</span> axios <span class="token punctuation">.</span> interceptors <span class="token punctuation">.</span> response <span class="token punctuation">.</span> handlers <span class="token punctuation">[</span> <span class="token number">0</span> <span class="token punctuation">]</span> <span class="token punctuation">.</span> rejected <span class="token punctuation">;</span> <span class="token function">errorInterceptor</span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> response <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">,</span> <span class="token number">500</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">function</span> <span class="token function">isLoggedIn</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> accountService <span class="token punctuation">.</span> accountValue <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">function</span> <span class="token function">idFromUrl</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">const</span> urlParts <span class="token operator">=</span> url <span class="token punctuation">.</span> <span class="token function">split</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'/'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">return</span> <span class="token function">parseInt</span> <span class="token punctuation">(</span> urlParts <span class="token punctuation">[</span> urlParts <span class="token punctuation">.</span> length <span class="token operator">-</span> <span class="token number">1</span> <span class="token punctuation">]</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">function</span> <span class="token function">body</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> <span class="token punctuation">[</span> <span class="token single-quoted-string string">'post'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'put'</span> <span class="token punctuation">]</span> <span class="token punctuation">.</span> <span class="token function">includes</span> <span class="token punctuation">(</span> method <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token keyword">return</span> params <span class="token punctuation">[</span> <span class="token number">0</span> <span class="token punctuation">]</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">function</span> <span class="token function">newAccountId</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> accounts <span class="token punctuation">.</span> length <span class="token operator">?</span> Math <span class="token punctuation">.</span> <span class="token function">max</span> <span class="token punctuation">(</span> <span class="token punctuation">.</span> <span class="token punctuation">.</span> <span class="token punctuation">.</span> accounts <span class="token punctuation">.</span> <span class="token function">map</span> <span class="token punctuation">(</span> x <span class="token operator">=</span> <span class="token operator">></span> x <span class="token punctuation">.</span> id <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token number">1</span> <span class="token punctuation">:</span> <span class="token number">1</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">function</span> <span class="token function">generateJwtToken</span> <span class="token punctuation">(</span> account <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// create token that expires in 15 minutes</span> <span class="token keyword">const</span> tokenPayload <span class="token operator">=</span> <span class="token punctuation">{</span> exp <span class="token punctuation">:</span> Math <span class="token punctuation">.</span> <span class="token function">round</span> <span class="token punctuation">(</span> <span class="token keyword">new</span> <span class="token class-name">Date</span> <span class="token punctuation">(</span> Date <span class="token punctuation">.</span> <span class="token function">now</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">+</span> <span class="token number">15</span> <span class="token operator">*</span> <span class="token number">60</span> <span class="token operator">*</span> <span class="token number">1000</span> <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">getTime</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token operator">/</span> <span class="token number">1000</span> <span class="token punctuation">)</span> <span class="token punctuation">,</span> id <span class="token punctuation">:</span> account <span class="token punctuation">.</span> id <span class="token punctuation">}</span> <span class="token keyword">return</span> `fake <span class="token operator">-</span> jwt <span class="token operator">-</span> token <span class="token punctuation">.</span> <span class="token variable">$</span> <span class="token punctuation">{</span> <span class="token function">btoa</span> <span class="token punctuation">(</span> <span class="token constant">JSON</span> <span class="token punctuation">.</span> <span class="token function">stringify</span> <span class="token punctuation">(</span> tokenPayload <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">}</span> ` <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> |
6. Init Facebook SDK
Path: /src/_helpers/init-facebook-sdk.js
The Facebook SDK init function is run before the Vue 3 application starts in main.js, it loads and launches the Facebook SDK and fetches the user’s login status from Facebook. If the user is logged in with Facebook, they will automatically log into the Vue application with the Facebook access token and be taken to the homepage, otherwise the application will start up normally and show the login page.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 | import <span class="token punctuation">{</span> accountService <span class="token punctuation">}</span> from <span class="token single-quoted-string string">'@/_services'</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> facebookAppId <span class="token operator">=</span> process <span class="token punctuation">.</span> env <span class="token punctuation">.</span> <span class="token constant">VUE_APP_FACEBOOK_APP_ID</span> <span class="token punctuation">;</span> export <span class="token keyword">function</span> <span class="token function">initFacebookSdk</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token keyword">new</span> <span class="token class-name">Promise</span> <span class="token punctuation">(</span> resolve <span class="token operator">=</span> <span class="token operator">></span> <span class="token punctuation">{</span> <span class="token comment">// wait for facebook sdk to initialize before starting the vue app</span> window <span class="token punctuation">.</span> fbAsyncInit <span class="token operator">=</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token constant">FB</span> <span class="token punctuation">.</span> <span class="token function">init</span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> appId <span class="token punctuation">:</span> facebookAppId <span class="token punctuation">,</span> cookie <span class="token punctuation">:</span> <span class="token boolean constant">true</span> <span class="token punctuation">,</span> xfbml <span class="token punctuation">:</span> <span class="token boolean constant">true</span> <span class="token punctuation">,</span> version <span class="token punctuation">:</span> <span class="token single-quoted-string string">'v8.0'</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// auto authenticate with the api if already logged in with facebook</span> <span class="token constant">FB</span> <span class="token punctuation">.</span> <span class="token function">getLoginStatus</span> <span class="token punctuation">(</span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> authResponse <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token operator">=</span> <span class="token operator">></span> <span class="token punctuation">{</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> authResponse <span class="token punctuation">)</span> <span class="token punctuation">{</span> accountService <span class="token punctuation">.</span> <span class="token function">apiAuthenticate</span> <span class="token punctuation">(</span> authResponse <span class="token punctuation">.</span> accessToken <span class="token punctuation">)</span> <span class="token punctuation">.</span> <span class="token function">then</span> <span class="token punctuation">(</span> resolve <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">else</span> <span class="token punctuation">{</span> <span class="token function">resolve</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">;</span> <span class="token comment">// load facebook sdk script</span> <span class="token punctuation">(</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> d <span class="token punctuation">,</span> s <span class="token punctuation">,</span> id <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">var</span> js <span class="token punctuation">,</span> fjs <span class="token operator">=</span> d <span class="token punctuation">.</span> <span class="token function">getElementsByTagName</span> <span class="token punctuation">(</span> s <span class="token punctuation">)</span> <span class="token punctuation">[</span> <span class="token number">0</span> <span class="token punctuation">]</span> <span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> d <span class="token punctuation">.</span> <span class="token function">getElementById</span> <span class="token punctuation">(</span> id <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token keyword">return</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> js <span class="token operator">=</span> d <span class="token punctuation">.</span> <span class="token function">createElement</span> <span class="token punctuation">(</span> s <span class="token punctuation">)</span> <span class="token punctuation">;</span> js <span class="token punctuation">.</span> id <span class="token operator">=</span> id <span class="token punctuation">;</span> js <span class="token punctuation">.</span> src <span class="token operator">=</span> <span class="token double-quoted-string string">"https://connect.facebook.net/en_US/sdk.js"</span> <span class="token punctuation">;</span> fjs <span class="token punctuation">.</span> parentNode <span class="token punctuation">.</span> <span class="token function">insertBefore</span> <span class="token punctuation">(</span> js <span class="token punctuation">,</span> fjs <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">(</span> document <span class="token punctuation">,</span> <span class="token single-quoted-string string">'script'</span> <span class="token punctuation">,</span> <span class="token single-quoted-string string">'facebook-jssdk'</span> <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> |
7. JWT Interceptor
Path: /src/_helpers/jwt.interceptor.js
JWT Interceptor intercepts http requests from the app to add a JWT access token to the Authorization header if the user is logged in and requests an api url of the Vue application (process.env.VUE_APP_API_URL).
It is implemented as an interceptor on request to axios, by passing a callback function to axios.interceptors.request.use (), you can intercept requests before they are sent to the server. For more information about the axios blocker, see https://github.com/axios/axios#interceptors .
The jwt interceptor is launched on application startup in the main.js. file
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | import axios from <span class="token single-quoted-string string">'axios'</span> <span class="token punctuation">;</span> import <span class="token punctuation">{</span> accountService <span class="token punctuation">}</span> from <span class="token single-quoted-string string">'@/_services'</span> <span class="token punctuation">;</span> export <span class="token keyword">function</span> <span class="token function">jwtInterceptor</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> axios <span class="token punctuation">.</span> interceptors <span class="token punctuation">.</span> request <span class="token punctuation">.</span> <span class="token keyword">use</span> <span class="token punctuation">(</span> request <span class="token operator">=</span> <span class="token operator">></span> <span class="token punctuation">{</span> <span class="token comment">// add auth header with jwt if account is logged in and request is to the api url</span> <span class="token keyword">const</span> account <span class="token operator">=</span> accountService <span class="token punctuation">.</span> accountValue <span class="token punctuation">;</span> <span class="token keyword">const</span> isLoggedIn <span class="token operator">=</span> account <span class="token operator">?</span> <span class="token punctuation">.</span> token <span class="token punctuation">;</span> <span class="token keyword">const</span> isApiUrl <span class="token operator">=</span> request <span class="token punctuation">.</span> url <span class="token punctuation">.</span> <span class="token function">startsWith</span> <span class="token punctuation">(</span> process <span class="token punctuation">.</span> env <span class="token punctuation">.</span> <span class="token constant">VUE_APP_API_URL</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">if</span> <span class="token punctuation">(</span> isLoggedIn <span class="token operator">&&</span> isApiUrl <span class="token punctuation">)</span> <span class="token punctuation">{</span> request <span class="token punctuation">.</span> headers <span class="token punctuation">.</span> common <span class="token punctuation">.</span> Authorization <span class="token operator">=</span> `Bearer <span class="token variable">$</span> <span class="token punctuation">{</span> account <span class="token punctuation">.</span> token <span class="token punctuation">}</span> ` <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token keyword">return</span> request <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> |
BECAUSE. Conclude
That way I practice through the vue 3 app initialization, the fake backend as well as the auth part for the app. In the next part, I will guide you on creating a router, building functions as well as completing the application.
You can see the article details here: https://jasonwatmore.com/post/2020/10/06/vue-3-facebook-login-tutorial-example