下面是我的核心依赖项和它的版本,来自我的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-auth
的useSession
钩子访问session
对象,以获取accessToken来向我的API发出经过身份验证的请求。
这是我使用session
的accessToken
发出身份验证请求的钩子:
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
来发出身份验证请求。
1条答案
按热度按时间mftmpeh81#
我所做的解决问题的方法是将API拦截器放在 Package 应用程序的HOC中,在
SessionProvider
下面一层。这样,我的拦截器就可以访问useSession
数据,因为它现在位于React Component
中。