2017-05-07 228 views
0

对不起,我简单的问题,我只是不断发现的例子“如何使用它们”不“的时候使用它们”我如何刷新刷新令牌

基本上我有用于创建refreshToken和销毁完成的代码它

// Compare token in the database and create a new access token 
Player.prototype.validateRefreshToken = function(username, refreshToken) { 
    return new Promise(async (resolve, reject) => { 
     try { 
      let player = await this.col.findOneAsync({ username, refreshToken}); 
      if (player) { 
       let token = jwt.sign(
        { 
         id: player._id, 
         username: player.username, 
         email: player.email, 
         roles: player.role || "user" 
        }, 
        globals.jwtSecret, 
        { 
         expiresIn: "300" 
        } 
       ); 

       return resolve(token); 
      } else { 
       return resolve(null); 
      } 
     } catch(err) { 
      console.log("[ERROR]: There was an error trying to validateRefreshToken"); 
      console.log(err); 
      return reject(err); 
     } 
    }); 
} 

// Destroy users refreshToken by generating a new one and not delivering 
// it to the client 
Player.prototype.rejectToken = function (refreshToken) { 
    return new Promise(async (resolve, reject) => { 
     try { 
      let player = await this.col.findOneAndUpdateAsync(
       { refreshToken }, 
       { $set: { refreshToken: randtoken.uid(256) }, 
      }); 
      if (player) { 
       return resolve(true); 
      } else { 
       return resolve(false); 
      } 
     } catch(err) { 
      console.log("[ERROR]: There was an error trying to rejectToken"); 
      console.log(err); 
      return reject(err); 
     } 
    }); 
} 

// API Routes 
// Check Refresh Token 
router.post("/token", async (ctx, next) => { 
    let username = _.get(ctx.request.body, "username"); 
    let refreshToken = _.get(ctx.request.body, "refreshToken"); 

    if (refreshToken) { 
     try { 
      let token = ctx.models.player.validateRefreshToken(username, refreshToken); 
      if (token) { 
       ctx.body = { success: true, token }; 
      } else { 
       ctx.body = { success: false, errors: ["You need to reauthenticate yourself their was an issue getting your refresh token"] }; 
      } 
     } catch(err) { 
      console.log(err); 
      ctx.body = { success: false, errors: ["Internal Server Error"] }; 
     } 
    } else { 
     ctx.body = { success: false, errors: ["You are not authenticated"] }; 
    } 
}); 


// Destroy refresh token 
router.post("/token/reject", async (ctx, next) => { 
    let refreshToken = _.get(ctx.request.body, "refreshToken"); 
    if (refreshToken) { 
     try { 
      let result = await ctx.models.player.rejectToken(refreshToken); 
      if (result) { 
       ctx.body = { success: true }; 
      } else { 
       ctx.body = { success: false, errors: ["You are not authenticated"] }; 
      } 
     } catch(err) { 
      console.log(err); 
      ctx.body = { success: false, errors: ["Internal Server Error"] }; 
     } 
    } 
}); 

但是当我应该post/token

例如,我不知道我的问题有人做了post要求自己的个人资料/profile/me但是却能得到许可的错误,现在该怎么办,我怎么自动化/token

我希望这是有道理的,如果它不问我澄清

回答

0

我假设你的应用程序是移动/桌面应用程序 - 网络应用程序通常不需要这种支持(尽管他们可以,我猜)。您的应用将执行HTTP请求。当令牌过期时,HTTP请求会返回401 Unauthorized。陷阱。

在陷阱代码中,检查您的令牌是否已过期。如果有,刷新。如果刷新不起作用,请执行完整身份验证。如果令牌未过期,请将401一直传回您的代码,因为其他事情正在进行。

在C#/ Xamarin中,您可以使用委托处理程序。在iOS或Android中,您可以将原始HTTP客户端(NSURLSession或HttpClient)封装在执行陷阱的包装器方法中。在JavaScript/React Native/Cordova中,您可以打包执行陷阱的抓取调用。

+0

如果您想在C#/ Xamarin中使用示例,请参阅我的书中的代码:https://adrianhall.github.io/develop-mobile-apps-with-csharp-and-azure/chapter2/realworld/#using -refresh-tokens –

+0

将陷阱陷入并进行验证后,是否有方法重新发出失败的请求? – Datsik

+0

当您输入包装部分时,您将存储该请求的副本。如果需要,可以在刷新后重新发出请求。 –