Jwt 下一个Hasura刷新令牌

Jwt 下一个Hasura刷新令牌,jwt,next.js,hasura,next-auth,Jwt,Next.js,Hasura,Next Auth,我正在尝试为Hasura身份验证和授权设置Nextuth。因为Hasura需要定制jwt,所以我不能使用OAuth提供者提供的默认访问令牌。因此,我在[…nextuth].js中使用encode块对自定义jwt令牌进行编码,一切正常。但是我不知道如何为我的自定义令牌实现刷新令牌。下面是我的“pages/api/auth/[…nextuth].js” import*作为jwt从“jsonwebtoken”导入; 从“下一次身份验证”导入下一次身份验证; 从“下一个身份验证/提供程序”导入提供程序;

我正在尝试为Hasura身份验证和授权设置Nextuth。因为Hasura需要定制jwt,所以我不能使用OAuth提供者提供的默认访问令牌。因此,我在[…nextuth].js中使用encode块对自定义jwt令牌进行编码,一切正常。但是我不知道如何为我的自定义令牌实现刷新令牌。下面是我的“pages/api/auth/[…nextuth].js”

import*作为jwt从“jsonwebtoken”导入;
从“下一次身份验证”导入下一次身份验证;
从“下一个身份验证/提供程序”导入提供程序;
导出默认值nextuth({
供应商:[
提供商,谷歌({
clientId:process.env.GOOGLE\u CLIENT\u ID,
clientSecret:process.env.GOOGLE\u CLIENT\u SECRET,
授权URL:
"https://accounts.google.com/o/oauth2/v2/auth?prompt=consent&access_type=offline&response_type=code",
}),
],
秘密:process.env.secret,
会议:{
jwt:没错,
},
jwt:{
秘密:process.env.secret,
encode:async({secret,token,maxAge})=>{
const JWT索赔={
sub:token.id,
name:token.name,
电子邮件:token.email,
图片:token.picture,
iat:Date.now()/1000,
exp:Math.floor(Date.now()/1000)+60,
"https://hasura.io/jwt/claims": {
“x-hasura-allowed-roles”:[“用户”],
“x-hasura-default-role”:“用户”,
“x-hasura-role”:“用户”,
“x-hasura-user-id”:token.id,
},
};
const encodedToken=jwt.sign(jwtClaims,secret,{算法:“HS256”});
返回编码token;
},
解码:异步({secret,token,maxAge})=>{
const decodedToken=jwt.verify(令牌,秘密,{算法:[“HS256”]});
返回解码后的数据;
},
},
页码:{
//登录:'/auth/signIn',//显示登录按钮
//注销:'/auth/signOut',//显示带有注销按钮的表单
//错误:'/auth/error',//查询字符串中传递的错误代码为?error=
//verifyRequest:“/auth/verify request”“,//用于检查电子邮件页面
//newUser:null//如果已设置,则新用户将在首次登录时被定向到此处
},
//回调是异步函数,可以用来控制发生的事情
//当一个动作被执行时。
// https://next-auth.js.org/configuration/callbacks
回调:{
//异步登录(用户、帐户、配置文件){return true},
//异步重定向(url,baseUrl){return baseUrl},
异步会话(会话、令牌){
const encodedToken=jwt.sign(令牌,process.env.SECRET{
算法:“HS256”,
});
session.token=encodedToken;
session.id=token.id;
返回承诺。解决(会话);
},
异步jwt(令牌、用户、帐户、配置文件、isNewUser){
const isUserSignedIn=user?真:假;
//对我们的GraphQLAPI进行http调用
//将此存储在postgres中
如果(isUserSignedIn){
token.id=profile.id.toString();
}
返回承诺。解决(令牌);
},
},
//事件对于日志记录很有用
// https://next-auth.js.org/configuration/events
事件:{},
//如果出现问题,请在控制台中启用调试消息
是的,
});

有人能告诉我在使用自定义jwt令牌时如何使用next auth处理刷新令牌吗?

我目前使用的是我在
next auth
issues页面上的一篇文章中找到的方法

本质上,我们使用的是
clientMaxAge
选项的组合,您可以将该选项传递到提供程序中,以重新访问会话,从而重新运行jwt回调。我不确定我是否正确地使用了
keepAlive
属性,但目前这似乎是正确的轮询,尽管您可能需要尝试一下

在JWT回调中,您可以使用逻辑来对照另一个过期时间检查现有过期时间,并从服务器获取一个新令牌以分配给会话

/\u app.tsx
常量会话选项={
clientMaxAge:60*30,//如果缓存超过30分钟,则重新获取会话
keepAlive:60*30,//每小时发送一次keepAlive消息
};
..
//[…nextuth].ts
常量回调:回调选项={
异步jwt(令牌:任意,用户:任意){
如果(用户){
token.accessToken=user.token;
token.expires=Date.now()+user.config.user_SESSION_LENGTH_,以秒为单位*1000;
}
//不要访问用户,因为它只可用一次,请访问token.accessToken
if(令牌?.accessToken){
const tokenexpire=token.expires;
const almostNow=Date.now()+60*1000;
if(tokenexpirement!==未定义&&tokenexpirement