How to change request headers with server middleware

2.9k Views Asked by At

According to server directory documentation of Nuxt 3, server middleware can be used to change request headers. I want to add an authorization header and attach a bearer token to my requests via server middleware.

// /server/middleware/auth.js
export default defineEventHandler((event) => {
  event.context.authorization = 'Bearer test';
  event.node.req.headers = {...event.node.req.headers, Authorization:'Bearer test'};
});

I tried above code and it works on every request, but it doesn't seem to add anything to request headers. How can I achieve this? Which property should I change?

2

There are 2 best solutions below

7
On

Edit

OP just clarified that the authorization is from a cookie session.

Example of cookie that is store in the browser. enter image description here

You can use the useRequestHeaders composable

When requesting the API in the browser, it will be something like this.

<script lang="ts" setup>
const { data } = await useFetch('/api/test', {
  headers: useRequestHeaders(['cookie'])
})
</script>
<template>
  <div>
     Hello World
  </div>
</template>

In your server middleware e.g. ~/server/middleware/log.ts

export default defineEventHandler((event) => {
    const requestedURL = getRequestURL(event)
    if (requestedURL.pathname === '/api/test') {
        const cookieHeaders = getHeader(event, 'cookie')
        // console.log(cookieHeaders)
        if (cookieHeaders) {
            const cookieArr = cookieHeaders.split(';').map((c) => c.trim()) // ensure to remove white spaces
            cookieArr.forEach((cookie) => {
                // console.log(cookie)
                if (cookie.startsWith('authorization')) {
                    console.log(cookie)
                }
            })
        }
    }
})

enter image description here

1
On

Try the assignment in the following way instead:

Object.assign(event.node.req.headers, { Authorization: 'Bearer test' })