Implemented refresh endpoint for google provider

This commit is contained in:
Raghunandan
2020-05-25 16:05:35 +02:00
parent 618065b783
commit 95f86e7482
5 changed files with 94 additions and 13 deletions
+10 -4
View File
@@ -25,10 +25,16 @@
"morgan": "^1.10.0",
"winston": "^3.2.1",
"yn": "^4.0.0",
"passport": "0.4.1",
"passport-google-oauth20": "2.0.0",
"@types/passport": "1.0.3",
"@types/passport-google-oauth20": "2.0.3"
"passport": "^0.4.1",
"passport-google-oauth20": "^2.0.0",
"passport-oauth2-refresh": "^2.0.0",
"passport-oauth2": "^1.5.0",
"cookie-parser": "^1.4.5",
"@types/passport-oauth2-refresh": "^1.1.1",
"@types/passport": "^1.0.3",
"@types/passport-google-oauth20": "^2.0.3",
"@types/cookie-parser": "^1.4.2",
"@types/passport-oauth2": "^1.4.9"
},
"devDependencies": {
"@backstage/cli": "^0.1.1-alpha.6",
@@ -15,8 +15,9 @@
*/
import passport from 'passport';
import express from 'express';
import express, { CookieOptions } from 'express';
import { Strategy as GoogleStrategy } from 'passport-google-oauth20';
import refresh from 'passport-oauth2-refresh';
import {
AuthProvider,
AuthProviderRouteHandlers,
@@ -25,6 +26,7 @@ import {
import { postMessageResponse } from './../utils';
import { InputError } from '@backstage/backend-common';
const THOUSAND_DAYS_MS = 1000 * 24 * 60 * 60 * 1000;
export class GoogleAuthProvider
implements AuthProvider, AuthProviderRouteHandlers {
private readonly providerConfig: AuthProviderConfig;
@@ -54,6 +56,18 @@ export class GoogleAuthProvider
next: express.NextFunction,
) {
return passport.authenticate('google', (_, user) => {
const { refreshToken } = user;
delete user.refreshToken;
const options: CookieOptions = {
maxAge: THOUSAND_DAYS_MS,
secure: false,
sameSite: 'none',
path: 'localhost:3000/auth/google',
httpOnly: true,
};
res.cookie('grtoken', refreshToken, options);
postMessageResponse(res, {
type: 'auth-result',
payload: user,
@@ -62,7 +76,33 @@ export class GoogleAuthProvider
}
async logout(_req: express.Request, res: express.Response) {
res.send('logout!');
return res.send('logout!');
}
async refresh(req: express.Request, res: express.Response) {
const refreshToken = req.cookies['grtoken'];
const scope = req.query.scope?.toString() ?? '';
const params = scope ? { scope } : {};
if (!refreshToken) {
return res.status(401).send('Missing session cookie');
}
refresh.requestNewAccessToken(
'google',
refreshToken,
params,
(err, accessToken) => {
if (err || !accessToken) {
return res.status(401).send('Failed to refresh access token');
}
return res.send({
accessToken,
expiresInSeconds: 36000,
});
},
);
}
strategy(): passport.Strategy {
+1 -1
View File
@@ -24,7 +24,7 @@ export const defaultRouter = (provider: AuthProviderRouteHandlers) => {
router.get('/handler/frame', provider.frameHandler);
router.get('/logout', provider.logout);
if (provider.refresh) {
router.get('/refreshToken', provider.refresh);
router.get('/refresh', provider.refresh);
}
return router;
};
@@ -17,6 +17,9 @@
import express from 'express';
import Router from 'express-promise-router';
import passport from 'passport';
import cookieParser from 'cookie-parser';
import refresh from 'passport-oauth2-refresh';
import OAuth2Strategy from 'passport-oauth2';
import { Logger } from 'winston';
import { providers } from './../providers/config';
import { makeProvider } from '../providers';
@@ -39,6 +42,9 @@ export async function createRouter(
);
logger.info(`Configuring provider: ${providerId}`);
passport.use(strategy);
if (strategy instanceof OAuth2Strategy) {
refresh.use(strategy);
}
providerRouters[providerId] = providerRouter;
}
@@ -52,6 +58,7 @@ export async function createRouter(
router.use(passport.initialize());
router.use(passport.session());
router.use(cookieParser());
for (const providerId in providerRouters) {
if (providerRouters.hasOwnProperty(providerId)) {