feat(SW-68): refactor digital signature
This commit is contained in:
@@ -44,4 +44,4 @@ AUTH_URL="$PUBLIC_URL/api/web/auth"
|
|||||||
NEXTAUTH_URL="$PUBLIC_URL/api/web/auth"
|
NEXTAUTH_URL="$PUBLIC_URL/api/web/auth"
|
||||||
|
|
||||||
GOOGLE_STATIC_MAP_KEY=""
|
GOOGLE_STATIC_MAP_KEY=""
|
||||||
GOOGLE_STATIC_MAP_SECRET=""
|
GOOGLE_STATIC_MAP_SIGNATURE_SECRETT=""
|
||||||
|
|||||||
@@ -14,7 +14,7 @@ import { LangParams, PageArgs } from "@/types/params"
|
|||||||
export default async function SelectHotelPage({
|
export default async function SelectHotelPage({
|
||||||
params,
|
params,
|
||||||
}: PageArgs<LangParams>) {
|
}: PageArgs<LangParams>) {
|
||||||
const { formatMessage } = await getIntl()
|
const intl = await getIntl()
|
||||||
|
|
||||||
const { attributes } = await serverClient().hotel.getHotel({
|
const { attributes } = await serverClient().hotel.getHotel({
|
||||||
hotelId: "d98c7ab1-ebaa-4102-b351-758daf1ddf55",
|
hotelId: "d98c7ab1-ebaa-4102-b351-758daf1ddf55",
|
||||||
@@ -44,7 +44,7 @@ export default async function SelectHotelPage({
|
|||||||
variant="underscored"
|
variant="underscored"
|
||||||
href="#"
|
href="#"
|
||||||
>
|
>
|
||||||
{formatMessage({ id: "Show map" })}
|
{intl.formatMessage({ id: "Show map" })}
|
||||||
<ChevronRightIcon color="burgundy" className={styles.icon} />
|
<ChevronRightIcon color="burgundy" className={styles.icon} />
|
||||||
</Link>
|
</Link>
|
||||||
<HotelFilter filters={hotelFilters} />
|
<HotelFilter filters={hotelFilters} />
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
/* eslint-disable @next/next/no-img-element */
|
/* eslint-disable @next/next/no-img-element */
|
||||||
import crypto from "crypto"
|
import crypto from "node:crypto"
|
||||||
import url from "url"
|
|
||||||
|
|
||||||
import { env } from "@/env/server"
|
import { env } from "@/env/server"
|
||||||
|
|
||||||
@@ -22,15 +21,6 @@ function encodeBase64Hash(key: Buffer, data: string) {
|
|||||||
return crypto.createHmac("sha1", key).update(data).digest("base64")
|
return crypto.createHmac("sha1", key).update(data).digest("base64")
|
||||||
}
|
}
|
||||||
|
|
||||||
function createRequestUrl(path: string, secret: string) {
|
|
||||||
const uri = new URL(path)
|
|
||||||
const safeSecret = decodeBase64Hash(removeWebSafe(secret))
|
|
||||||
const hashedSignature = makeWebSafe(
|
|
||||||
encodeBase64Hash(safeSecret, uri.pathname + uri.search)
|
|
||||||
)
|
|
||||||
return url.format(uri) + "&signature=" + hashedSignature
|
|
||||||
}
|
|
||||||
|
|
||||||
export default function StaticMap({
|
export default function StaticMap({
|
||||||
city,
|
city,
|
||||||
width,
|
width,
|
||||||
@@ -39,13 +29,18 @@ export default function StaticMap({
|
|||||||
mapType,
|
mapType,
|
||||||
}: StaticMapProps) {
|
}: StaticMapProps) {
|
||||||
const key = env.GOOGLE_STATIC_MAP_KEY
|
const key = env.GOOGLE_STATIC_MAP_KEY
|
||||||
const secret = env.GOOGLE_STATIC_MAP_SECRET
|
const secret = env.GOOGLE_STATIC_MAP_SIGNATURE_SECRET
|
||||||
const url = `https://maps.googleapis.com/maps/api/staticmap?center=${city}&zoom=${zoomLevel}&size=${width}x${height}&maptype=${mapType}&key=${key}`
|
const safeSecret = decodeBase64Hash(removeWebSafe(secret))
|
||||||
|
|
||||||
return (
|
const url = new URL(
|
||||||
<img
|
`https://maps.googleapis.com/maps/api/staticmap?center=${city}&zoom=${zoomLevel}&size=${width}x${height}&maptype=${mapType}&key=${key}`
|
||||||
src={createRequestUrl(url, secret)}
|
|
||||||
alt={`Map of ${city} city center`}
|
|
||||||
/>
|
|
||||||
)
|
)
|
||||||
|
|
||||||
|
const hashedSignature = makeWebSafe(
|
||||||
|
encodeBase64Hash(safeSecret, url.pathname + url.search)
|
||||||
|
)
|
||||||
|
|
||||||
|
const src = url.toString() + "&signature=" + hashedSignature
|
||||||
|
|
||||||
|
return <img src={src} alt={`Map of ${city} city center`} />
|
||||||
}
|
}
|
||||||
|
|||||||
5
env/server.ts
vendored
5
env/server.ts
vendored
@@ -59,7 +59,7 @@ export const env = createEnv({
|
|||||||
WEBVIEW_ENCRYPTION_KEY: z.string(),
|
WEBVIEW_ENCRYPTION_KEY: z.string(),
|
||||||
BOOKING_ENCRYPTION_KEY: z.string(),
|
BOOKING_ENCRYPTION_KEY: z.string(),
|
||||||
GOOGLE_STATIC_MAP_KEY: z.string(),
|
GOOGLE_STATIC_MAP_KEY: z.string(),
|
||||||
GOOGLE_STATIC_MAP_SECRET: z.string(),
|
GOOGLE_STATIC_MAP_SIGNATURE_SECRET: z.string(),
|
||||||
},
|
},
|
||||||
emptyStringAsUndefined: true,
|
emptyStringAsUndefined: true,
|
||||||
runtimeEnv: {
|
runtimeEnv: {
|
||||||
@@ -105,6 +105,7 @@ export const env = createEnv({
|
|||||||
WEBVIEW_ENCRYPTION_KEY: process.env.WEBVIEW_ENCRYPTION_KEY,
|
WEBVIEW_ENCRYPTION_KEY: process.env.WEBVIEW_ENCRYPTION_KEY,
|
||||||
BOOKING_ENCRYPTION_KEY: process.env.BOOKING_ENCRYPTION_KEY,
|
BOOKING_ENCRYPTION_KEY: process.env.BOOKING_ENCRYPTION_KEY,
|
||||||
GOOGLE_STATIC_MAP_KEY: process.env.GOOGLE_STATIC_MAP_KEY,
|
GOOGLE_STATIC_MAP_KEY: process.env.GOOGLE_STATIC_MAP_KEY,
|
||||||
GOOGLE_STATIC_MAP_SECRET: process.env.GOOGLE_STATIC_MAP_SECRET,
|
GOOGLE_STATIC_MAP_SIGNATURE_SECRET:
|
||||||
|
process.env.GOOGLE_STATIC_MAP_SIGNATURE_SECRET,
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
|
|||||||
Reference in New Issue
Block a user