【问题标题】:How do I refresh a Refresh Token如何刷新刷新令牌
【发布时间】:2017-05-07 14:05:03
【问题描述】:

抱歉这个简单的问题,我一直在寻找“如何使用它们”而不是“何时使用它们”的示例

基本上我已经完成了创建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

例如有人向他们自己的个人资料/profile/me 发出post 请求,但出现权限错误,现在该怎么办,我该如何自动化/token

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

【问题讨论】:

    标签: node.js oauth-2.0 refresh-token


    【解决方案1】:

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

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

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

    【讨论】:

    猜你喜欢
    • 2017-05-29
    • 2021-08-20
    • 2020-07-12
    • 2017-10-12
    • 2022-10-31
    • 2016-01-05
    • 2019-06-29
    • 2018-10-01
    • 1970-01-01
    相关资源
    最近更新 更多