需要帮助来弄清楚Mobx与Next-Auth

sbdsn5lh  于 2023-06-29  发布在  其他
关注(0)|答案(1)|浏览(125)

下面是我的核心依赖项和它的版本,来自我的package.json文件:
“mobx”:“^6.5.0”,“mobx-react”:“^7.3.0”,“下一页”:“12.1.6”,“next-auth”:“4.2.1”,“React”:“17.0.1”,
我使用next-auth来处理我的next.js应用程序中的身份验证,特别是获取和存储我的API accessToken。问题是,next-auth需要将应用程序 Package 在SessionProvider中。这样我们以后就可以通过next-authuseSession钩子访问session对象,以获取accessToken来向我的API发出经过身份验证的请求。
这是我使用sessionaccessToken发出身份验证请求的钩子:

import { setupAuthAPI } from '@/services/authAPI'
import { useSession } from 'next-auth/react'
import { useEffect } from 'react'

const useAuthAPI = () => {
  const { data: session } = useSession()

  useEffect(() => {
    const requestIntercept = setupAuthAPI().interceptors.request.use(
      config => {
        if (!config.headers.Authorization) {
          config.headers.Authorization = `Bearer ${session?.accessToken}`
        }
        return config
      },
      error => Promise.reject(error)
    )

    return () => {
      setupAuthAPI().interceptors.request.eject(requestIntercept)
    }
  }, [session])

  return setupAuthAPI
}

export default useAuthAPI

setupAuthAPI只是一个Axios示例。
这是我的Mobx商店:

import { observer } from 'mobx-react'
import { makeAutoObservable } from 'mobx'
.....
.....
import { toast } from 'react-toastify'
import useAuthAPI from '@/hooks/useAuthAPI'

......
......

class ResellerStore implements ResellerStoreInterface {
  resellerOptions: ResellerOption[]
  loading = false

  constructor() {
    makeAutoObservable(
      this,
      {},
      {
        autoBind: true
      }
    )
  }

  async loadAll() {
    const setupAuthAPI = useAuthAPI()
    this.loading = true
    this.resellerOptions = []
    setupAuthAPI()
      .get('Reseller/all')
      .then(response => {
        const newResellerOptions = []
        response.data.forEach(reseller => {
          newResellerOptions.push({
            label: reseller.companyName,
            value: reseller.id
          })
        })

        this.resellerOptions = newResellerOptions
        this.loading = false
      })
  }

  
}

export { observer }
const resellerStore = new ResellerStore()

export { resellerStore }

但是在这个实现中,我得到了错误:错误:无效的钩子调用。钩子只能在函数组件的主体内部调用。
我需要一些帮助,试图找出正确的流程来使用我的accessToken,它由next-auth管理,并使用它在我的mobx商店内进行身份验证请求。先谢谢你。
我尝试了问题中已经描述的实现。我所期望的是使用next-auth来处理我的next.js应用程序中的身份验证,并且还能够使用它在我的mobx商店中管理的accessToken来发出身份验证请求。

mftmpeh8

mftmpeh81#

我所做的解决问题的方法是将API拦截器放在 Package 应用程序的HOC中,在SessionProvider下面一层。这样,我的拦截器就可以访问useSession数据,因为它现在位于React Component中。

相关问题