Skip to content

Commit

Permalink
Connect FS to FD mock
Browse files Browse the repository at this point in the history
  • Loading branch information
SandyCT97 committed Aug 10, 2018
1 parent 6d832ad commit eee4e3f
Show file tree
Hide file tree
Showing 13 changed files with 122 additions and 99 deletions.
22 changes: 15 additions & 7 deletions app.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,9 @@ import express from 'express';
import logger from 'morgan';
import session from 'express-session';

import { getAuthorizationUrl, getLogoutUrl} from './helpers/utils';
import { getAccessToken } from './controllers/accessToken';
import { getAuthorizationUrl, getLogoutUrl } from './helpers/utils';
import getAccessToken from './controllers/accessToken';
import getFDData from './controllers/callFD';

const app = express();

Expand All @@ -25,7 +26,7 @@ const sessionConfig = {
// session config for production
if (app.get('env') === 'production') {
app.set('trust proxy', 1); // trust first proxy
sess.cookie.secure = true; // serve secure cookies
sessionConfig.cookie.secure = true; // serve secure cookies
}

if (process.env.NODE_ENV !== 'test') {
Expand All @@ -38,7 +39,8 @@ app.use(session(sessionConfig));

// Routes (@see @link{ see https://expressjs.com/en/guide/routing.html }
app.get('/', (req, res) => {
res.render('pages/index');
const isAuth = false;
res.render('pages/index', { isAuth });
});
app.get('/login', (req, res) => {
res.redirect(getAuthorizationUrl());
Expand All @@ -51,17 +53,23 @@ app.get('/callback', (req, res) => {
getAccessToken(res, req);
});
app.get('/profile', (req, res) => {
const isAuth = true;
const user = req.session.userInfo;
res.render('pages/profile', { user });
const isFdData = false;
res.render('pages/profile', { user, isAuth, isFdData });
});
app.get('/callFd', (req, res) => {
getFDData(req, res);
});
app.get('/logout', (req, res) => {
res.redirect(getLogoutUrl(req));
});
app.get('/end', (req, res) => {
app.get('/logged-out', (req, res) => {
const isAuth = false;
// resetting the id token hint.
req.session.id_token = null;
req.session.userInfo = null;
res.render('pages/logged-out');
res.render('pages/logged-out', { isAuth });
});

// Starting server
Expand Down
4 changes: 1 addition & 3 deletions config/config.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,7 @@
"CLIENT_SECRET": "c48ff5ae96e870f507507555f7bc4dd361d2aac31df219fe6e92bbcca65f73f5",
"SECRET_KEY": "8f373c6e6a48ce0f5931f414b6739e4e0aa82eda20a083dc5c0522b6c691b17b",
"REDIRECT_URL": "http://localhost:3000/callback",
"LOGOUT_REDIRECT_URL": "http://localhost:3000/end",
"LOGOUT_REDIRECT_URL": "http://localhost:3000/logged-out",
"SCOPE": "openid profile birth",
"STATE": "customState11",
"NONCE": "customNone11",
"FD_MOCK_URL": "http://localhost:4000/revenu-fiscal-de-reference"
}
12 changes: 3 additions & 9 deletions controllers/accessToken.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,9 @@
*/
import axios from 'axios';
import querystring from 'querystring';
import { getUser } from '../helpers/user';
import { getFDData } from '../helpers/callFD';
import getUser from '../helpers/user';
import config from '../config/config.json';

const sendTokenToFD = false;

const tokenUrl = config.TOKEN_URL;
const redirectUrl = config.REDIRECT_URL;
const clientId = config.CLIENT_SECRET;
Expand All @@ -19,7 +16,7 @@ const secretKey = config.SECRET_KEY;
* Init FranceConnect authentication login process.
* Make every http call to the different API endpoints.
*/
export const getAccessToken = async (res, req) => {
const getAccessToken = async (res, req) => {
// Set request params.
const url = tokenUrl;
const body = {
Expand All @@ -41,13 +38,10 @@ export const getAccessToken = async (res, req) => {
.then((tokenData) => {
req.accessToken = tokenData.access_token;
req.session.id_token = tokenData.id_token;
// Use to send the access token to an data provider.
if (sendTokenToFD) {
getFDData(tokenData);
}
// Make a call to the France Connect API endpoint to get user data.
getUser(req, res);
})
.catch(err => res.send(err.message));
};

export default getAccessToken;
21 changes: 14 additions & 7 deletions controllers/callFD.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,14 @@
* @see @link{ https://partenaires.franceconnect.gouv.fr/fcp/fournisseur-donnees }
* @see @link{ https://github.com/france-connect/data-providers-examples }
*/
import axios from "axios/index";
import axios from 'axios/index';
import config from '../config/config.json';

const fdMockUrl = config.FD_MOCK_URL;
// this value is only for a demo purpose you should use the Access token send by FC
const fakeAccessToken = '9af033eb295d0fe113988d29a26527f920114973b3a1ca7bdb44768fd0c73937'
const fakeAccessToken = '9af033eb295d0fe113988d29a26527f920114973b3a1ca7bdb44768fd0c73937';

export const getFDData= (req, res) => {
const getFDData = (req, res) => {
axios({
method: 'GET',
/**
Expand All @@ -26,11 +26,18 @@ export const getFDData= (req, res) => {
const isAuth = true;
const user = req.session.userInfo;
const dgfipData = [];
const responsedata = fdResponse.data;

for(var property in fdResponse.data) {
dgfipData[property] = fdResponse.data[property];
for (const property in responsedata) {
if (property !== null) {
dgfipData[property] = fdResponse.data[property];
}
}
res.render('pages/profile', { user, isAuth, isFdData, dgfipData });
res.render('pages/profile', {
user, isAuth, isFdData, dgfipData,
});
})
.catch(err => res.send(err.message));
}
};

export default getFDData;
5 changes: 3 additions & 2 deletions helpers/user.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,11 @@
import axios from 'axios';
import config from '../config/config.json';

exports.getUser = async (req, res) => {
const getUser = async (req, res) => {
if (!req.accessToken) {
res.status(401).send('Access token is required');
return;
};
}
// Set request header
const headerConfig = {
headers: {
Expand All @@ -26,3 +26,4 @@ exports.getUser = async (req, res) => {
})
.catch(err => res.send(err.message));
};
export default getUser;
6 changes: 3 additions & 3 deletions helpers/utils.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,15 @@
* @see @link{ https://partenaires.franceconnect.gouv.fr/fcp/fournisseur-service# }
*/
import config from '../config/config.json';

// TODO hard code state et nonce because they normaly generate from every request
export const getAuthorizationUrl = () => `${config.AUTHORIZATION_URL}?response_type=code`
+ `&client_id=${config.CLIENT_SECRET}&redirect_uri=${config.REDIRECT_URL}`
+ `&scope=${config.SCOPE}&state=${config.STATE}&nonce=${config.NONCE}`;
+ `&scope=${config.SCOPE}&state=customState11&nonce=customNonce11`;


/**
* Format the url 's that is used in a redirect call to France Connect logout API endpoint
* @returns {string}
*/
export const getLogoutUrl = req => `${config.LOGOUT_URL}?id_token_hint=${req.session.id_token}`
+ `&state=${config.STATE}&post_logout_redirect_uri=${config.LOGOUT_REDIRECT_URL}`;
+ `&state=customState11&post_logout_redirect_uri=${config.LOGOUT_REDIRECT_URL}`;
6 changes: 6 additions & 0 deletions public/css/custom.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
.container {
margin-top: 0.2em;
}
.custom-content {
margin-top: 3.5em;
}
10 changes: 5 additions & 5 deletions test/helpers/utils.spec.js
Original file line number Diff line number Diff line change
@@ -1,16 +1,16 @@
/* eslint-env mocha */
import { assert } from 'chai';
import UtilsHelper from '../../helpers/utils';
import { getAuthorizationUrl, getLogoutUrl } from '../../helpers/utils';
import config from '../../config/config.json';

describe('helpers/authorization', () => {
it('should return a correct authorization url to call the API "/api/v1/authorize"', () => {
// Setup
const expectedUrl = `${config.AUTHORIZATION_URL}?response_type=code`
+ `&client_id=${config.CLIENT_SECRET}&redirect_uri=${config.REDIRECT_URL}`
+ `&scope=${config.SCOPE}&state=${config.STATE}&nonce=${config.NONCE}`;
+ `&scope=${config.SCOPE}&state=customState11&nonce=customNonce11`;
// Action
const helperResponse = UtilsHelper.getAuthorizationUrl();
const helperResponse = getAuthorizationUrl();
// Assert
assert.deepEqual(helperResponse, expectedUrl);
});
Expand All @@ -23,9 +23,9 @@ describe('helpers/authorization', () => {
};
// Setup
const expectedUrl = `${config.LOGOUT_URL}?id_token_hint=${req.session.id_token}`
+ `&state=${config.STATE}&post_logout_redirect_uri=${config.LOGOUT_REDIRECT_URL}`;
+ `&state=customState11&post_logout_redirect_uri=${config.LOGOUT_REDIRECT_URL}`;
// Action
const helperResponse = UtilsHelper.getLogoutUrl(req);
const helperResponse = getLogoutUrl(req);
// Assert
assert.deepEqual(helperResponse, expectedUrl);
});
Expand Down
9 changes: 9 additions & 0 deletions views/includes/footer.ejs
Original file line number Diff line number Diff line change
@@ -1,3 +1,12 @@
<footer class="footer custom-content">
<div class="content has-text-centered">
<p>
<a href="https://partenaires.franceconnect.gouv.fr/fcp/fournisseur-service">
<strong>Documentation France Connect Partenaires</strong>
</a>.
</p>
</div>
</footer>
<script src="http://fcp.integ01.dev-franceconnect.fr/js/franceconnect.js"></script>
</body>
</html>
25 changes: 23 additions & 2 deletions views/includes/header.ejs
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,27 @@
content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/bulma/0.7.1/css/bulma.min.css" integrity="sha256-zIG416V1ynj3Wgju/scU80KAEWOsO5rRLfVyRDuOv7Q=" crossorigin="anonymous" />
<title>Demo Fournisseur de Service</title>
<link rel="stylesheet" href="css/custom.css" />
<title>Démonstrateur Fournisseur de Service</title>
</head>
<body>
<body>
<div class="container is-fluid">
<nav class="navbar" role="navigation" aria-label="main navigation">
<div class="navbar-start">
<div class="navbar-brand">
<h2 class="title is-2">Démonstrateur Fournisseur de Service</h2>
</div>
</div>
<div class="navbar-end">
<div class="navbar-item">
<% if (isAuth) {%>
<div id="fconnect-profile" data-fc-logout-url="/logout" class="custom_navbar_position">
<a href="#" class="has-text-link" >
<%= user.family_name %> <%= user.given_name %>
</a>
</div>
<% }%>
</div>
</div>
</nav>
</div>
29 changes: 6 additions & 23 deletions views/pages/index.ejs
Original file line number Diff line number Diff line change
@@ -1,27 +1,10 @@
<% include ../includes/header.ejs %>
<section class="hero is-link is-fullheight">
<div class="hero-body">
<div class="container">
<h1 class="title">
Le Guichet des Chiroquois
</h1>
<br>
<div class="subtitle">
<ul>
<li>Accéder aux différentes démarches administratives en ligne de votre ville.</li>
</ul>
<br>
<h4>Gagnez du temps dans la réalisation de vos démarches en vous connectant par FranceConnect!</h4>
<br>
<p>Connectez vous à l'administration <b>en toute sécurité</b>, <b>sans créer de nouveau compte</b>.</p>
</div>
<div class="container has-text-centered">
<!-- FC btn -->
<a href="/login">
<img src="img/FCboutons-10.png" alt="">
</a>
</div>
</div>
<section class="custom-content">
<div class="container has-text-centered">
<!-- FC btn -->
<a href="/login">
<img src="img/FCboutons-10.png" alt="">
</a>
</div>
</section>
<% include ../includes/footer.ejs %>
13 changes: 2 additions & 11 deletions views/pages/logged-out.ejs
Original file line number Diff line number Diff line change
@@ -1,14 +1,5 @@
<% include ../includes/header.ejs %>
<section class="hero is-link is-fullheight">
<div class="hero-body">
<div class="container">
<h1 class="title">
Guichet des Chiroquois
</h1>
<div class="subtitle">
<h4>Merci de votre visite.</h4>
</div>
</div>
</div>
<section class="container custom-content">
<h4>Merci de votre visite.</h4>
</section>
<% include ../includes/footer.ejs %>
59 changes: 32 additions & 27 deletions views/pages/profile.ejs
Original file line number Diff line number Diff line change
@@ -1,32 +1,37 @@
<% include ../includes/header.ejs %>
<section class="hero is-link is-fullheight">
<div class="hero-body">
<div class="container">
<h1 class="title">
Profile utilisateur
</h1>
<div class="subtitle">
<div class="card">
<div class="card-content">
<div class="content">
<div id="fconnect-profile" data-fc-logout-url="/logout">
<a href="#" class="has-text-link">
<%= user.family_name %> <%= user.given_name %>
</a>
</div>
<div class="container has-text-centered">
<p class="has-text-centered"> Votre connexion au Guichet Chiroquois, via France Connect, est un succès</p>
<p> Utiliser le button en haut gauche (avec votre nom et prénom), afin accèder à :</p>
<div class="">
<p>Votre historique de connexion</p>
<p>Au bouton de deconnexion</p>
</div>
</div>
</div>
</div>
</div>
</div>
<section class="container custom-content">
<div class="columns">
<div class="column is-half">
<ul>
<li>Obtenir des informations de La direction générale des Finances publiques (DGFIP) </li>
<li class="has-text-centered"><a class="button is-link" href="/callFD">Appel à la DGFIP</a></li>
</ul>
</div>
<% if (isFdData) {%>
<div class="column">
<ul>
<li>RFR</li>
<li>Nombre de personnes à charge</li>
<li>Enfants à charge en garde alternée</li>
<li>personnes Invalides à charge</li>
<li>enfants Majeurs Célibataires</li>
<li>Enfants Majeurs Maries ou Chargé de famille</li>
<li>NbPacP</li>
</ul>
</div>
<div class="column">
<ul>
<li><%= dgfipData.RFR %></li>
<li><%= dgfipData.nombreDePersonnesACharge %></li>
<li><%= dgfipData.nombreDEnfantsACharge %></li>
<li><%= dgfipData.enfantsAChargeEnGardeAlternee %></li>
<li><%= dgfipData.personnesInvalidesACharge %></li>
<li><%= dgfipData.enfantsMajeursCelibataires %></li>
<li><%= dgfipData.enfantsMajeursMariesOuChargeDeFamille %></li>
<li><%= dgfipData.nbPacP %></li>
</ul>
</div>
<%}%>
</div>
</section>
<% include ../includes/footer.ejs %>

0 comments on commit eee4e3f

Please sign in to comment.