Nuxt.js Nuxtjs Auth模块在中间件中不工作

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

嗨,我发现了一个与我类似的老问题,但没有关于StackOverFlow的答案:

同样在GitHub上,没有有效的解决方案:

所以问题是,如果我在任何页面中调用
$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。或者其他人看到了这一点并实现了它;)共享代码和示例总是很有帮助的。