Вставка маркера доступа из сеанса в запрос API

#reactjs #authentication #axios #next.js #next-auth

Вопрос:

Я создал веб-приложение, которое позволяет мне входить в систему с помощью Spotify, а также получать токен доступа пользователей, необходимый для использования API. Однако я не уверен в том, как вставить маркер пользователей из их сеанса в заголовки API.

Я вижу в консоли, что запрос на авторизацию возвращает токен пользователя, и я убедился, что они работают.

Возврат журнала консоли после входа пользователя в систему

Я использую Next-Auth для аутентификации пользователя через Spoitfy. Мой текущий файл […nextauth].js

 import NextAuth from "next-auth"
import Providers from "next-auth/providers"
import Spotify from "../../../providers/spotify"
import Twitch from "../../..//providers/twitch"

export default (req, res) => NextAuth(req, res, {
  providers: [
      Spotify({
      clientId: process.env.SPOTIFY_CLIENT_ID,
      clientSecret: process.env.SPOTIFY_CLIENT_SECRET,
    }),
    Twitch({
      clientId: process.env.TWITCH_CLIENT_ID,
      clientSecret: process.env.TWITCH_CLIENT_SECRET,
    })
  ],
  callbacks: { 
    async jwt(token, _, session) {
      if (session) {
        token.id = session.id
        token.accessToken = session.accessToken
      }
      console.log(token);
       return token
    },
    async session(session, user) {
      session.user = user
      return session
    }
  },
})
 

Мой текущий файл для выполнения запроса API с помощью axios

 import axios from "axios";
import { VStack, Heading, Text, Box, Center } from "@chakra-ui/layout";
import { signIn, signOut, useSession } from 'next-auth/client'

const Spotify = ({ Spotify }) => { if(!Spotify){ return <div>Loading...</div> }
// eslint-disable-next-line react-hooks/rules-of-hooks
const [ session, loadings ] = useSession();
  console.log(Spotify);
  return (
    <VStack>
      {Spotify.map((Spoty) => (
          <div key={Spoty.id}>
            <Heading>{Spoty.name}</Heading>
            <Text>Link: {Spoty.href}</Text>
            <Text>Owner: {Spoty.owner.display_name}</Text>
          </div>
        ))}
    </VStack>
  );
};

Spotify.getInitialProps = async (ctx) => {

  try { 
    const res = await axios.get("https://api.spotify.com/v1/me/playlists", { 
      headers: {
        Authorization: `Bearer ${session.user.accessToken}`
      }
    });

    const Spotify = res.data.items;
    return { Spotify };
  } catch (error) {
    return { error };
  }

};

export default Spotify;
 

Комментарии:

1. Как рекомендовано Next.js , вы должны заменить getInitialProps на getServerSideProps. Затем вы можете восстановить сеанс с getSession помощью , т. е. const session = await getSession({ req: ctx.req }) .

2. Боже, ты легенда, я не знаю, почему я просто не мог этого понять, я думаю, все это часть обучения! Большое вам спасибо!