Sign in / Sign up with Google
The following diagram shows the Sign in flow with Google, but we will split this into two cases:
- Scenario 1 : that is the flow you see below, the frontend is Vue, the Backend is Sails.js, authentication is done in some parts on both sides.
- Scenario 2 : We handle OAuth2 completely on Frontend and only allow calls with Backend when successful authentication.
Configure Google OAuth
Before we get started, we have to make sure Google is properly configured for your new application. Visit the Google API Console to get OAuth 2.0 credentials such as Client ID and Client Secret known by both Google and our application.
- Log into the Google Developer Console
- Click Select a Project and select New Project in the drop down menu.
- Name the project you want, I named it Google-oauth2 , click Create.
- Once the project is created (takes a few seconds), reuse the project picker and select your newly created project.
- Now you must add the available API. Select and open Library in the menu on the left.
- Open and enable Google + API and Google Analytics API
- Open the Credentials tab, click Create Credentials and select OAuth client ID – Google also provides a wizard to help you make this decision if you want to use Google Auth in another context.
- The API console opens, click Credentials on the left Nav and switch to the OAuth Consent Screen tab – providing the application name and optional logo.
- On the next screen. In the Application type, select Web application and name it – I use Google-oauth2
- In the Authorized JavaScript section, enter http: // localhost: 8080 and in the Authorized redirect URIs add http: // localhost: 8080 / callback and click the Create button
- Finally, a popup window containing the Client ID and Client Secret , copying those values, we will need them in our code.
Create Frontend and Login Page
We have created the Sign In and Sign Up page here [github] ( https://github.com/Jebasuthan/Vue-Facebook-Google-oAuth ).
The frontend build in src with npm
and npm run serve
will provide the landing page at the following path: localhost:8080/login
Login with Facebook / Google
In the frontend , open main.js and change the following:
1 2 3 4 5 6 7 8 | import GoogleAuth from <span class="token single-quoted-string string">'@/config/google.js'</span> <span class="token keyword">const</span> gauthOption <span class="token operator">=</span> <span class="token punctuation">{</span> clientId <span class="token punctuation">:</span> <span class="token single-quoted-string string">'xxxxxxxxxxx.apps.googleusercontent.com'</span> <span class="token punctuation">,</span> scope <span class="token punctuation">:</span> <span class="token single-quoted-string string">'profile email'</span> <span class="token punctuation">,</span> prompt <span class="token punctuation">:</span> <span class="token single-quoted-string string">'select_account'</span> <span class="token punctuation">}</span> Vue <span class="token punctuation">.</span> <span class="token keyword">use</span> <span class="token punctuation">(</span> GoogleAuth <span class="token punctuation">,</span> gauthOption <span class="token punctuation">)</span> |
Once you’ve initialized the googleauth installation in vue main.js , in the login components, you need to add a click event to log in.
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 | <span class="token operator"><</span> template <span class="token operator">></span> <span class="token operator"><</span> div <span class="token keyword">class</span> <span class="token operator">=</span> <span class="token double-quoted-string string">"signup-buttons"</span> <span class="token operator">></span> <span class="token operator"><</span> a href <span class="token operator">=</span> <span class="token double-quoted-string string">"#"</span> <span class="token keyword">class</span> <span class="token operator">=</span> <span class="token double-quoted-string string">"google-signup"</span> @click <span class="token punctuation">.</span> prevent <span class="token operator">=</span> <span class="token double-quoted-string string">"loginWithGoogle"</span> <span class="token operator">></span> <span class="token operator"><</span> svg xmlns <span class="token operator">=</span> <span class="token double-quoted-string string">"http://www.w3.org/2000/svg"</span> width <span class="token operator">=</span> <span class="token double-quoted-string string">"18"</span> height <span class="token operator">=</span> <span class="token double-quoted-string string">"18"</span> viewBox <span class="token operator">=</span> <span class="token double-quoted-string string">"0 0 18 18"</span> aria <span class="token operator">-</span> hidden <span class="token operator">=</span> <span class="token double-quoted-string string">"true"</span> <span class="token operator">></span> <span class="token operator"><</span> title <span class="token operator">></span> Google <span class="token operator"><</span> <span class="token operator">/</span> title <span class="token operator">></span> <span class="token operator"><</span> g fill <span class="token operator">=</span> <span class="token double-quoted-string string">"none"</span> fill <span class="token operator">-</span> rule <span class="token operator">=</span> <span class="token double-quoted-string string">"evenodd"</span> <span class="token operator">></span> <span class="token operator"><</span> path fill <span class="token operator">=</span> <span class="token double-quoted-string string">"#4285F4"</span> d <span class="token operator">=</span> <span class="token double-quoted-string string">"M17.64 9.2045c0-.6381-.0573-1.2518-.1636-1.8409H9v3.4814h4.8436c-.2086 1.125-.8427 2.0782-1.7959 2.7164v2.2581h2.9087c1.7018-1.5668 2.6836-3.874 2.6836-6.615z"</span> <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> path <span class="token operator">></span> <span class="token operator"><</span> path fill <span class="token operator">=</span> <span class="token double-quoted-string string">"#34A853"</span> d <span class="token operator">=</span> <span class="token double-quoted-string string">"M9 18c2.43 0 4.4673-.806 5.9564-2.1805l-2.9087-2.2581c-.8059.54-1.8368.859-3.0477.859-2.344 0-4.3282-1.5831-5.036-3.7104H.9574v2.3318C2.4382 15.9832 5.4818 18 9 18z"</span> <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> path <span class="token operator">></span> <span class="token operator"><</span> path fill <span class="token operator">=</span> <span class="token double-quoted-string string">"#FBBC05"</span> d <span class="token operator">=</span> <span class="token double-quoted-string string">"M3.964 10.71c-.18-.54-.2822-1.1168-.2822-1.71s.1023-1.17.2823-1.71V4.9582H.9573A8.9965 8.9965 0 0 0 0 9c0 1.4523.3477 2.8268.9573 4.0418L3.964 10.71z"</span> <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> path <span class="token operator">></span> <span class="token operator"><</span> path fill <span class="token operator">=</span> <span class="token double-quoted-string string">"#EA4335"</span> d <span class="token operator">=</span> <span class="token double-quoted-string string">"M9 3.5795c1.3214 0 2.5077.4541 3.4405 1.346l2.5813-2.5814C13.4632.8918 11.426 0 9 0 5.4818 0 2.4382 2.0168.9573 4.9582L3.964 7.29C4.6718 5.1627 6.6559 3.5795 9 3.5795z"</span> <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> path <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> g <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> svg <span class="token operator">></span> Google <span class="token operator"><</span> <span class="token operator">/</span> a <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> div <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> template <span class="token operator">></span> <span class="token operator"><</span> script <span class="token operator">></span> import router from <span class="token single-quoted-string string">'@/router/router'</span> export <span class="token keyword">default</span> <span class="token punctuation">{</span> name <span class="token punctuation">:</span> <span class="token single-quoted-string string">'login_signup_social'</span> <span class="token punctuation">,</span> methods <span class="token punctuation">:</span> <span class="token punctuation">{</span> loginWithGoogle <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> this <span class="token punctuation">.</span> <span class="token variable">$gAuth</span> <span class="token punctuation">.</span> <span class="token function">signIn</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> GoogleUser <span class="token operator">=</span> <span class="token operator">></span> <span class="token punctuation">{</span> <span class="token comment">// on success do something</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'GoogleUser'</span> <span class="token punctuation">,</span> GoogleUser <span class="token punctuation">)</span> <span class="token keyword">var</span> userInfo <span class="token operator">=</span> <span class="token punctuation">{</span> loginType <span class="token punctuation">:</span> <span class="token single-quoted-string string">'google'</span> <span class="token punctuation">,</span> google <span class="token punctuation">:</span> GoogleUser <span class="token punctuation">}</span> this <span class="token punctuation">.</span> <span class="token variable">$store</span> <span class="token punctuation">.</span> <span class="token function">commit</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'setLoginUser'</span> <span class="token punctuation">,</span> userInfo <span class="token punctuation">)</span> router <span class="token punctuation">.</span> <span class="token function">push</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'/home'</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">catch</span> <span class="token punctuation">(</span> error <span class="token operator">=</span> <span class="token operator">></span> <span class="token punctuation">{</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'error'</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 punctuation">}</span> <span class="token operator"><</span> <span class="token operator">/</span> script <span class="token operator">></span> <span class="token operator"><</span> style <span class="token operator">></span> <span class="token operator"><</span> <span class="token operator">/</span> style <span class="token operator">></span> |
When running the user interface, use the npm run serve
command after clicking the Google Login / Signup button, you will get accessToken .
You now have accessToken from Google. You must pass through accessToken so that the backend api has enough information about Google’s logged in users using OAuth2Client .
In the SailsJS backend, open google-login.js and change:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <span class="token keyword">const</span> <span class="token punctuation">{</span> OAuth2Client <span class="token punctuation">}</span> <span class="token operator">=</span> <span class="token keyword">require</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'google-auth-library'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> client <span class="token operator">=</span> <span class="token keyword">new</span> <span class="token class-name">OAuth2Client</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'xxxxxxxxxxxxx.apps.googleusercontent.com'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> ticket <span class="token operator">=</span> await client <span class="token punctuation">.</span> <span class="token function">verifyIdToken</span> <span class="token punctuation">(</span> <span class="token punctuation">{</span> idToken <span class="token punctuation">:</span> inputs <span class="token punctuation">.</span> accessToken <span class="token punctuation">,</span> audience <span class="token punctuation">:</span> <span class="token single-quoted-string string">'xxxxx.apps.googleusercontent.com'</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> payload <span class="token operator">=</span> ticket <span class="token punctuation">.</span> <span class="token function">getPayload</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> console <span class="token punctuation">.</span> <span class="token function">log</span> <span class="token punctuation">(</span> <span class="token single-quoted-string string">'Google payload is '</span> <span class="token operator">+</span> <span class="token constant">JSON</span> <span class="token punctuation">.</span> <span class="token function">stringify</span> <span class="token punctuation">(</span> payload <span class="token punctuation">)</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token keyword">const</span> userid <span class="token operator">=</span> payload <span class="token punctuation">[</span> <span class="token single-quoted-string string">'sub'</span> <span class="token punctuation">]</span> <span class="token punctuation">;</span> let email <span class="token operator">=</span> payload <span class="token punctuation">[</span> <span class="token single-quoted-string string">'email'</span> <span class="token punctuation">]</span> <span class="token punctuation">;</span> let emailVerified <span class="token operator">=</span> payload <span class="token punctuation">[</span> <span class="token single-quoted-string string">'email_verified'</span> <span class="token punctuation">]</span> <span class="token punctuation">;</span> let name <span class="token operator">=</span> payload <span class="token punctuation">[</span> <span class="token double-quoted-string string">"name"</span> <span class="token punctuation">]</span> <span class="token punctuation">;</span> let pictureUrl <span class="token operator">=</span> payload <span class="token punctuation">[</span> <span class="token double-quoted-string string">"picture"</span> <span class="token punctuation">]</span> <span class="token punctuation">;</span> |
When you’re done, restart and reload the login page: http: // localhost: 8080 / login
When clicking on the Google button, Google Auth is done on a separate popup that allows entering Google credentials to authenticate applications:
After you have provided your Google login information, the frontend now runs the following authentication logic:
- Scenario 1 : The VueJS login component receives authorization code from google and calls the Sails backend in http: // localhost: 8080 / login . There authorization code is used to access access_token, refresh_token, id_token and scope . The user is returned to the Vuex user interface so that the user finally logs in to the landing page.
- Scenario 2 : The steps from Scenario 1 are only performed on the interface without calling the backend. You can checkout from github souce code
Source: https://medium.com/@itjebasuthan_90100/signup-with-google-using-vuejs-11c9d4428250