'API authentication into getStaticPath()

I'm having issues with API auth and getStaticPath(). I'm using Strapi on the backend. I have a page that shows a list of albums (no problem getting authenticated response from strapi) but for each album, I have an SSG page that uses getStaticPath().

My issue is that in order to get the different paths I need to fetch the API.

Here is my getStaticPath() :

export async function getStaticPaths({locales}) {


    const fetchAlbums = await fetch(`${process.env.DB_HOST}/api/albums?populate=*&locale=all`)
    const albumsData = await fetchAlbums.json();
    const albums = albumsData.data

    const paths = albums.map((album) => locales.map((locale) => ({
        params: {slug: album.attributes.slug},
        locale
    })))
        .flat()

    return {paths, fallback: false}
}

And here is the rest of my code just in case :

export async function getStaticProps({params, locale}, ctx) {

    const loginData = {

        identifier: process.env.DB_EMAIL,

        password: process.env.DB_PASSWORD,

    };

    const login = await fetch(`${process.env.DB_HOST}/api/auth/local`, {

        method: 'POST',

        headers: {

            Accept: 'application/json',

            'Content-Type': 'application/json',

        },

        body: JSON.stringify(loginData),

    });

    const loginResponseData = await login.json();


    const albumData = await getAlbumData(params.slug, locale, loginResponseData.jwt)

    return {
        props: {
            albumData
        }
    }
}

const useStyles = createStyles((theme) => ({
    image: {

        '@media (max-width: 900px)': {
            width: '100vw',
        },
    },
}));

export async function getStaticPaths({locales}) {


    const fetchAlbums = await fetch(`${process.env.DB_HOST}/api/albums?populate=*&locale=all`)
    const albumsData = await fetchAlbums.json();
    const albums = albumsData.data

    const paths = albums.map((album) => locales.map((locale) => ({
        params: {slug: album.attributes.slug},
        locale
    })))
        .flat()

    return {paths, fallback: false}
}

export default function AlbumDetails({albumData}) {


    const album = albumData['0'].attributes;
    const albumImage = album.image.data.attributes.url


    return (
        <Layout>
            <AlbumTitle name={album.name} image={albumImage} buy={album.buy} digital={album.digital} album={album}/>
            <div className={styles.infoContainer}>
                <div className={styles.description}>
                    <Reviews reviews={album.reviews.data}/>

                </div>
            </div>

            <MediaSeparator/>

            <Media media={album.video.data}/>


        </Layout>
    )

}

function AlbumTitle({name, image, album, buy, digital}) {
    const {classes} = useStyles();

    const locale = useRouter().locale;
    return (
        <div>

            <div className={styles.titleContainer}>
                <div className={styles.albumHeader}>
                    <div>
                        <div className={styles.albumCover}>
                            <Image className={classes.image}
                                   src={`${process.env.DB_HOST}${image}`}
                                // width={400}
                                // height={400}

                            />
                        </div>
                        <Listen spotify={album.spotify ? album.spotify : null} apple={album.apple ? album.apple : null}
                                deezer={album.deezer ? album.deezer : null}/>

                    </div>
                    <div className={styles.albumRightContainer}>
                        <h1 className={styles.albumName}>{name}</h1>

                        <AlbumInfos release={album.date.toString()} label={album.label} artists={album.artistes}/>
                        <p className={styles.albumDescription}>{album.description}</p>
                        <div className={styles.buttonContainer}>
                            <Menu menuButton={<MenuButton
                                className={style.buy}>{locale === 'en' ? ('BUY') : ('ACHETER')}</MenuButton>}>
                                <MenuItem className={styles.menuItem}>Guitar4Fan (CD)</MenuItem>
                                <MenuItem className={styles.menuItem}>BandCamp (Digital)</MenuItem>
                            </Menu>
                        </div>
                    </div>

                </div>


            </div>

        </div>

    )

How do I make authenticated API calls in getStaticPaths() in order to get my paths?



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source