直到最近,我在我的Nuxt项目中使用了我自己的注册/登录实现,在成功注册/登录之后,我能够做到这一点$axios。setToken(token,'Bearer'),它将在axios reguests上全局设置授权头。现在我必须重构应用程序并使用Nuxt auth模块。但现在我似乎无法设置此标题。
这是我的身份验证配置:
auth: {
strategies: {
local: {
endpoints: {
login: { url: '/auth/local', method: 'post', propertyName: 'jwt' },
logout: false,
user: { url: '/users/me', method: 'get', propertyName: false }
},
}
},
redirect: {
login: '/login',
home: '/home',
user: '/users/me'
},
}
我以为auth应该自动添加这个授权,因为它默认将globalToken
设置为true
,但它没有。所以我试图明确地指定它:
tokenRequired: true,
tokenType: 'bearer',
globalToken: true,
autoFetchUser: true
这没用。因此,在register/login方法中,我尝试自己在axios和$auth模块上设置令牌:
await this.$auth.loginWith('local', {
data
}).then(({data}) => {
this.$apolloHelpers.onLogin(data.jwt)
this.$axios.setToken(data.jwt, 'Bearer')
this.$auth.setToken('local', `Bearer ${data.jwt}`)
...
也没有效果。虽然在某些时候,我似乎只能成功地发送一个请求,并且我看到它在请求上有授权标头,但是当我切换页面并尝试发送另一个请求时,它同样没有标头,请求失败,出现错误403。
所以我又尝试了一件事——在我的默认布局中,在beforeMount()hook中,我尝试检查用户是否登录,以及他是否登录——设置标题:
if (this.$auth.loggedIn) {
this.$axios.setToken(this.$auth.getToken('local'))
}
再次成功发送了一个请求,但当切换到另一个页面并尝试发送另一个请求时-403。
而不是$axios。setToken()我试图设置授权标头:
this.$axios.defaults.headers.common.Authorization = `${this.$auth.getToken('local')}`
再一次-一个请求成功,另一个-403
为什么会这样?在注册/登录后,或者如果用户刷新页面并且已经登录,如何将授权标头设置为在所有请求上都存在?
以下是一个解决方案:
>
创建一个新插件,如/plugins/axios。js
在nuxt config中注册此插件:
plugins: [
'~/plugins/axios.js'
]
编写令牌检查和更新方法
我假设令牌刷新是驻留在存储中的异步方法。
export default function ({ $axios, store}) {
$axios.onRequest(async (config) => {
try {
/// Store action to get or retrieve a token if it has expired
const token = await store.dispatch('auth/getIdToken')
this.$axios.setToken(token, 'Bearer')
} catch (error) {
console.log("Could not update token:", error)
}
return config
})
}
关键部分是返回config,以便Axios可以继续请求。
学分归jonasjancarik:https://github.com/nuxt-community/axios-module/issues/482
一种方法是使用nuxtServerInit
获取jwt令牌并保存到Cookie/localstorage后,随后可以使用$axios。setToken
。全球访问。下面是示例代码,让您有一个想法。
actions: {
nuxtServerInit({ dispatch, commit, app }, context) {
const cookies = cparse.parse(context.req.headers.cookie || '')
if (cookies.hasOwnProperty('x-access-token')) {
app.$axios.setToken(cookies['x-access-token'], 'Bearer')
}
},
}
似乎有很多不同的方法可以做到这一点,但我试图只使用sinon,sinon-test,chai/mocha,axios,httpmock模块。我无法成功模拟使用axios进行的GET调用。我希望能够模拟来自axios调用的响应,这样单元测试实际上就不必发出外部API请求。 我尝试过通过创建沙箱来建立一个基本的单元测试,并使用sinon stub来建立一个GET调用并指定预期的响应。我不熟悉JavaS
使用axios,我尝试为所有请求设置默认标头身份验证令牌。但默认情况下它没有被发现,并且对于任何其他api调用,“授权”没有在标头中设置。 这是一个常用文件 登录后,我像这样设置标题 但是当我调用任何其他API标头进行授权时,CountryApi.js所在的位置没有设置 Country.js是这个
问题内容: 当我卷曲东西时,它可以正常工作: 我如何使它与axios一起正常工作?如果这很重要,我正在使用react: 由于某些原因,这不起作用。 问题答案: 这是我如何使用axios在react中上传文件 资源
我正在用Expo CLI构建一个React原生应用程序,我正在尝试用Axios和redux Thunk获取一些用户数据到我的redux商店。
在Gradle 6.3中,内部构建。gradle,mainClassName可以这样设置,没有任何问题: 在Gradle 6.61中,上面一行的结果是: JAVAlang.module。InvalidModuleDescriptorException:包修改。在模块中找不到应用程序 这可以通过删除mainClassName的模块部分来解决: 解决异常后,Gradle仍然声明: 没有为主类提供模块,
我有一个多模块项目,所有模块都有一个公共的父pom和一个聚合器/构建pom。我试图使用maven版本插件来更新/设置我所有模块的版本,但它一直跳过子模块。 项目布局:-通用/pom.xml(build pom)-通用/Superpom/pom.xml(父pom)-模块1/pom.xml(模块1 pom)-模块2/pom.xml(模块2 pom) 普通/聚甲醛。xml: 我尝试将插件添加到构建pom