This question is for anyone who is familiar with
I have been doing some online courses and understand how to do the two following things:
I am trying to combine the content from these two courses basically. I want to use Google Strategy + JWT Authentication. I want to use JWT instead of cookies because my app is going to be a web/mobile/tablet app, and I need to be accessing the api from different domains.
There are two issues I am having with this: To kick off the Google/facebook OAuth pipelines, you need to call either '/auth/facebook' or '/auth/google'. Both Oauth flows work basically the same so when I say '/auth/google' from now on, I am referring to either. Now the issue I'm having is: On the client, do I call the '/auth/google' route with a href button link or an axios/ajax call? If I use the href or axios/ajax approach I am still getting problems with both solutions.
The href approach problem: When I assign an <a>
tag with a href to '/auth/google' the authentication works perfectly fine. The user gets pushed through the Google Auth flow, they log in and the '/auth/google/callback' route gets called. The problem I have now is how do I correctly send the JWT token back to the client from '/auth/google/callback'?
After a lot of googling I have seen that people have simply passed the the JWT back to the client from the oauth callback in the redirect query param. For example:
res.redirect(301, `/dashboard?token=${tokenForUser(req.user)}`);
The issue I have with this is that now the the ability to authenticate is saved in my browser history! I could log out (destroying the token saved in localStorage), and then simply look at my browser url history, go back to the url that contains the token in the query param, and I would automatically log in again without having to go through the Google Strategy! This is a huge security flaw and is obviously the incorrect way to approach it.
The axios/ajax approach problem: Now before I explain the problem with this issue, I know for sure that If I get this working, it will solve all issues I was having with the previous href problem. If I manage to call '/google/auth' from an axios.get() call and receive the JWT in the response body, I will not be sending the token as url param, and it will not get saved in the browser history! Perfect right? well there is still some problems with this approach :(
When try to call axios.get('/auth/google')
I get the following error:
How I've tried to solve the problem:
app.use(cors());
to my index.js. Neither of these solutions solved the issue, so now I really feel stuck. I want to use the axios/ajax approach, but I'm not sure how to get past this cors error.
Sorry for such a long message, but I really felt I had to give you all the information in order for you to properly help me.
Thanks again, looking forward to hear from you!
From 1 Oct 2021, Singapore passports issued for citizens aged 16 and above are valid for 10 years. For more information, browse the FAQs. For citizens below the age of 16, the passport validity is 5 years.
Currently, the average waiting time for passport processing is at least six weeks from the time of application. It could take even longer if there is a greater surge in the number of applications or there are issues with the application such as the photograph submitted does not meet the requirements.
The vast majority of all passport applications are being dealt with well within 10 weeks. However, a passport can only be issued once all the checks have been completed satisfactorily and will take longer if applications are submitted with missing or incomplete information.
The passport application fee will remain unchanged at S$70. For applications submitted in person at Singapore's overseas missions, an equivalent of S$80 in foreign currency will be charged.
I solved this in this way:
I hope it helps. I implemented this multiple times and it showed like a good solution.
Though there is good answer, I wanted to add more information with example.
To disable session we need modify our redirect router. For example if we have redirect path /google/redirect like following, we need to pass { session: false } object as parameter.
router.get('/google/redirect', passport.authenticate('google', { session: false }), (req, res)=> { console.log(":::::::::: user in the redirect", req.user); //GENERATE JWT TOKEN USING USER res.send(TOKEN); })
So where does this user come from? This user comes from passport's callback function. In the previous snippet we have added passport.authenticate(....) This middlewire initiates passport's google-strategy's callback which deals with the user. For example
passport.use( new GoogleStrategy({ callbackURL: '/google/redirect', clientID: YOUR_GOOGLE_CLIENT_ID clientSecret: YOUR_GOOGLE_SECRET_KEY }, (accessToken, refreshToken, profile, done)=>{ console.log('passport callback function fired'); // FETCH USER FROM DB, IF DOESN'T EXIST CREATE ONE done(null, user); }) )
That's it. We have successfully combined JWT and Google/Facebook Strategy.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With