Nuxt.js Nuxtjs Auth模块在中间件中不工作
嗨,我发现了一个与我类似的老问题,但没有关于StackOverFlow的答案: 同样在GitHub上,没有有效的解决方案: 所以问题是,如果我在任何页面中调用Nuxt.js Nuxtjs Auth模块在中间件中不工作,nuxt.js,nuxtjs,Nuxt.js,Nuxtjs,嗨,我发现了一个与我类似的老问题,但没有关于StackOverFlow的答案: 同样在GitHub上,没有有效的解决方案: 所以问题是,如果我在任何页面中调用$auth.loggedIn,它就像一个符咒一样工作,但是如果我在自定义身份验证中间件中调用它(或者如果我使用默认的auth中间件),它总是返回false nuxt.config.js中的我的身份验证配置 auth:{ 战略:{ 本地:{ 端点:{ 登录:{ url:“/rest auth/login/”, 方法:“post”, prope
$auth.loggedIn
,它就像一个符咒一样工作,但是如果我在自定义身份验证中间件中调用它(或者如果我使用默认的auth
中间件),它总是返回false
nuxt.config.js中的我的身份验证配置
auth:{
战略:{
本地:{
端点:{
登录:{
url:“/rest auth/login/”,
方法:“post”,
propertyName:“键”,
},
注销:{url:'/rest auth/logout/',方法:'post'},
用户:{
url:“/rest auth/user/”,
方法:“get”,
propertyName:false,
},
},
令牌类型:“令牌”,
令牌名称:“授权”,
},
重定向:{
登录名:'/user\u dashboard',
主页:“/”,
},
},
},
我的自定义身份验证中间件
导出默认异步函数({$auth,redirect}){
const user=wait$auth.loggedIn
console.log(user)//不幸的是,我无法使nuxtjs/auth
在中间件中工作,但我能够通过将cookie universal nuxt
与nuxtjs/auth
结合使用来解决这个问题:
您可以保持axios版本不变,无需降级即可使用此解决方案
npm安装--保存cookie通用nuxt
在您的numxt.config.js
文件中添加cookie universal nuxt
:
模块:[
//其他模块。。。
“@nuxtjs/auth”,
“cookie universal nuxt”,
],
创建自定义的auth
中间件。我在中间件文件夹中调用了我的auth user
:
导出默认异步函数({app,redirect}){
//下面将直接查找由nuxtjs/auth创建的cookie
//而不是使用$auth.loggedIn
const user=wait app.$cookies.get('auth.\u token.local'))
如果(用户){
//让用户查看页面
}否则{
//重定向到主页
重定向(“/”)
}
}
然后在应用程序的根页面中声明您的中间件,您希望只有经过身份验证的用户才能访问:
导出默认值{
中间件:['auth-user'],
}
如果这不起作用,请通过在浏览器中打开开发人员工具/检查器来检查保存用户凭据的cookie名称
我也有同样的问题,我现在通过大量的尝试和错误解决了它
服务器端不知道loggedIn状态,因为他们没有实现它(?)
因此,我创建了自己的中间件来设置服务器端的状态
创建:
中间件/auth ssr.ts
import { Context, Middleware } from '@nuxt/types';
import { parse as parseCookie } from 'cookie';
import jsonwebtoken from 'jsonwebtoken';
import { IJwtPayload } from '../../api/_types/types';
/**
* This middleware is needed when running with SSR
* it checks if the token in cookie is set and injects it into the nuxtjs/auth module
* otherwise it will redirect to login
* @param context
*/
const debugAuthMiddleware: Middleware = async (context: Context) => {
if (process.server && context.req.headers.cookie != null) {
try {
const cookies = parseCookie(context.req.headers.cookie);
const token = cookies['auth._token.local'] || '';
const tokenWithoutBearer = token.replace('Bearer ', '');
// console.log('headers.cookie token', token);
// console.log('debugAuthMiddleware $auth 1', context.$auth.$state);
if (!token || token.includes('false')) {
// sometimes it stores 'Bearer false' when it unsets
return;
}
const jwt: IJwtPayload = (jsonwebtoken.decode(tokenWithoutBearer) as unknown) as IJwtPayload;
// console.log('jwt payload', jwt);
if (!jwt) {
return;
}
// console.log('set token ✅', jwt);
await context.$auth.setToken('locale', tokenWithoutBearer);
await context.$auth.setUser(jwt);
context.$auth.$state.loggedIn = true;
} catch (e) {
console.error('debugAuthMiddleware', e);
}
// console.log('debugAuthMiddleware $auth 2', context.$auth.$state);
}
};
export default debugAuthMiddleware;
然后在numxt.config.ts
中,我有一个中间件:
router: {
middleware: ['user-agent', 'auth-ssr', 'auth'],
},
这是我的身份验证配置:
auth: {
redirect: {
logout: '/?signedOut=1',
home: '/dashboard',
},
strategies: {
local: {
endpoints: {
login: { url: '/api/v1/auth/login', method: 'post', propertyName: 'token' },
logout: { url: '/api/v1/auth/logout', method: 'post' },
user: { url: '/api/v1/user', method: 'get', propertyName: 'user' },
},
autoFetchUser: false, // do not fetch automatically! user object is coming from login api call
rewriteRedirects: true, // If enabled, user will redirect back to the original guarded route instead of redirect.home.
fullPathRedirect: true, // If true, use the full route path with query parameters for redirect
},
},
},
然后服务器端nodejs/auth中间件获得正确的loggedinstate+user(我的JWT令牌包括userId、email、name、scope:[]).您是否尝试过在没有$符号的情况下使用auth?这应该可以解决您的问题。您好,我已经通过降级nuxt/axios模块解决了这个问题,您可以共享您的package.json吗?也许我可以查看一下我的,并对其进行比较。@nathan1658当然,请参阅question@nathan1658根据你的建议,我发现了这个问题:所以我正在努力使用以下命令降级axios:npm install@nuxtjs/axios@5.12.1
。祝我好运。仍然不工作。很抱歉,回复晚了。我的版本与你的版本相同。你能检查cookie上的安全设置吗?即,在http上调试时将其设置为false?这似乎需要做很多工作,但可能是解决此问题的更合适的方法。干得好!我是这应该直接在nuxtjs/auth中实现,这是SSR的开箱即用的工作。也许我将来有时间提出PR。或者其他人看到了这一点并实现了它;)共享代码和示例总是很有帮助的。