Compare commits
5 Commits
d7fa763d5e
...
ab57acdcd1
Author | SHA1 | Date | |
---|---|---|---|
ab57acdcd1 | |||
26609ebd6b | |||
d21291c643 | |||
4c9a868d6b | |||
c68141575f |
@ -22,8 +22,8 @@ const api = {
|
|||||||
post: <TBody extends BodyInit, TResponse>(url: string, body: TBody) => request<TResponse>(url, { method: 'POST', body, headers: { 'Content-Type': 'application/json' } }),
|
post: <TBody extends BodyInit, TResponse>(url: string, body: TBody) => request<TResponse>(url, { method: 'POST', body, headers: { 'Content-Type': 'application/json' } }),
|
||||||
}
|
}
|
||||||
|
|
||||||
export const getQrUrl = () => {
|
export const getQrUrl = (login: string) => {
|
||||||
return `${getBaseUrl()}/api/qr`;
|
return `${getBaseUrl()}/api/qr?login=${login}`;
|
||||||
}
|
}
|
||||||
|
|
||||||
export const getData = async () => {
|
export const getData = async () => {
|
||||||
|
@ -353,7 +353,7 @@ function App() {
|
|||||||
<div className='qr-code'>
|
<div className='qr-code'>
|
||||||
<h3>QR platba</h3>
|
<h3>QR platba</h3>
|
||||||
<div>Částka: {myOrder.totalPrice} Kč</div>
|
<div>Částka: {myOrder.totalPrice} Kč</div>
|
||||||
<img src={getQrUrl()} alt='QR kód' />
|
<img src={getQrUrl(auth.login)} alt='QR kód' />
|
||||||
<p>Generování QR kódů je v experimentální fázi - doporučujeme si překontrolovat údaje před odesláním platby.</p>
|
<p>Generování QR kódů je v experimentální fázi - doporučujeme si překontrolovat údaje před odesláním platby.</p>
|
||||||
</div>
|
</div>
|
||||||
}
|
}
|
||||||
|
@ -6,13 +6,16 @@ import jwt from 'jsonwebtoken';
|
|||||||
* @param login přihlašovací jméno uživatele
|
* @param login přihlašovací jméno uživatele
|
||||||
* @returns JWT token
|
* @returns JWT token
|
||||||
*/
|
*/
|
||||||
export function generateToken(login: string): string {
|
export function generateToken(login?: string): string {
|
||||||
if (!process.env.JWT_SECRET) {
|
if (!process.env.JWT_SECRET) {
|
||||||
throw Error("Není vyplněna proměnná prostředí JWT_SECRET");
|
throw Error("Není vyplněna proměnná prostředí JWT_SECRET");
|
||||||
}
|
}
|
||||||
if (process.env.JWT_SECRET.length < 32) {
|
if (process.env.JWT_SECRET.length < 32) {
|
||||||
throw Error("Proměnná prostředí JWT_SECRET musí být minimálně 32 znaků");
|
throw Error("Proměnná prostředí JWT_SECRET musí být minimálně 32 znaků");
|
||||||
}
|
}
|
||||||
|
if (!login || login.trim().length === 0) {
|
||||||
|
throw Error("Nebyl předán login");
|
||||||
|
}
|
||||||
return jwt.sign({ login }, process.env.JWT_SECRET);
|
return jwt.sign({ login }, process.env.JWT_SECRET);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -38,29 +38,44 @@ const parseToken = (req: any) => {
|
|||||||
|
|
||||||
// ----------- Metody nevyžadující token --------------
|
// ----------- Metody nevyžadující token --------------
|
||||||
|
|
||||||
app.get("/api/whoami",(req,res)=>{
|
app.get("/api/whoami", (req, res) => {
|
||||||
res.send(req.header('remote-user'));
|
res.send(req.header('remote-user'));
|
||||||
})
|
})
|
||||||
|
|
||||||
app.post("/api/login", (req, res) => {
|
app.post("/api/login", (req, res) => {
|
||||||
if (!req.body?.login) {
|
// Autentizace pomocí trusted headers
|
||||||
|
const remoteUser = req.header('remote-user');
|
||||||
|
if (remoteUser && remoteUser.length > 0) {
|
||||||
|
res.status(200).json(generateToken(remoteUser));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
// Klasická autentizace loginem
|
||||||
|
if (!req.body?.login || req.body.login.trim().length === 0) {
|
||||||
throw Error("Nebyl předán login");
|
throw Error("Nebyl předán login");
|
||||||
}
|
}
|
||||||
// TODO: je tohle hnusny?... bude to fungovat? lol
|
|
||||||
if (req.header('remote-user')){
|
|
||||||
let username = req.header('remote-user') || "jmenonemahlavicku"
|
|
||||||
res.status(200).json(generateToken(username));
|
|
||||||
} else {
|
|
||||||
// TODO zavést podmínky pro délku loginu (min i max)
|
// TODO zavést podmínky pro délku loginu (min i max)
|
||||||
res.status(200).json(generateToken(req.body.login));
|
res.status(200).json(generateToken(req.body.login));
|
||||||
|
});
|
||||||
|
|
||||||
|
// TODO dočasné řešení - QR se zobrazuje přes <img>, nemáme sem jak dostat token
|
||||||
|
app.get("/api/qr", (req, res) => {
|
||||||
|
// const login = getLogin(parseToken(req));
|
||||||
|
if (!req.query?.login) {
|
||||||
|
throw Error("Nebyl předán login");
|
||||||
}
|
}
|
||||||
|
const img = getQr(req.query.login as string);
|
||||||
|
res.writeHead(200, {
|
||||||
|
'Content-Type': 'image/png',
|
||||||
|
'Content-Length': img.length
|
||||||
|
});
|
||||||
|
res.end(img);
|
||||||
});
|
});
|
||||||
|
|
||||||
// ----------------------------------------------------
|
// ----------------------------------------------------
|
||||||
|
|
||||||
/** Middleware ověřující JWT token */
|
/** Middleware ověřující JWT token */
|
||||||
app.use((req, res, next) => {
|
app.use((req, res, next) => {
|
||||||
if (req.header('remote-user')){
|
if (req.header('remote-user')) {
|
||||||
console.log("Tvuj username: %s.", req.header('remote-user'));
|
console.log("Tvuj username: %s.", req.header('remote-user'));
|
||||||
}
|
}
|
||||||
if (!req.headers.authorization) {
|
if (!req.headers.authorization) {
|
||||||
@ -181,16 +196,6 @@ app.post("/api/updateChoice", (req, res) => {
|
|||||||
res.status(200).json(data);
|
res.status(200).json(data);
|
||||||
});
|
});
|
||||||
|
|
||||||
app.get("/api/qr", (req, res) => {
|
|
||||||
const login = getLogin(parseToken(req));
|
|
||||||
const img = getQr(login);
|
|
||||||
res.writeHead(200, {
|
|
||||||
'Content-Type': 'image/png',
|
|
||||||
'Content-Length': img.length
|
|
||||||
});
|
|
||||||
res.end(img);
|
|
||||||
});
|
|
||||||
|
|
||||||
app.post("/api/updateNote", (req, res) => {
|
app.post("/api/updateNote", (req, res) => {
|
||||||
const login = getLogin(parseToken(req));
|
const login = getLogin(parseToken(req));
|
||||||
if (req.body.note && req.body.note.length > 100) {
|
if (req.body.note && req.body.note.length > 100) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user