如果令牌过期,则自动刷新令牌

时间:2021-02-16 17:14:57

标签: coldfusion lucee

我有这个代码

    <cfscript>
    public struct function CreateToken() {
          var result = '';
          var apiKeys = {
            'appKey' : variables.username,
            'appSecret': variables.password
          };
          httpService = new http(method = "POST", url = "https://wesa.com/v1/tokens/create");
          httpService.addParam(type = "header", name="Content-Type", value = "application/json");
          httpService.addParam(type = "body", value = "#parseBody(apiKeys)#");
          result = httpService.send().getprefix();
          if(result.statuscode == '200') {
            resultDeserialized = deserializeJSON(result.fileContent);
          }
          return resultDeserialized;
        }
    
        public struct function RefreshToken(required string token) {
          var apiStruct = [:];
          apiStruct['refreshToken'] = arguments.token;
          httpService = new http(method = "POST", url = "https://wesa.com/v1/tokens/refresh");
          httpService.addParam(type = "header", name="Content-Type", value = "application/json");
          httpService.addParam(type = "body", value = "#parseBody(apiStruct)#");
          result = httpService.send().getprefix();
          if(result.statuscode == '200') {
            resultDeserialized = deserializeJSON(result.fileContent);
          }
          return resultDeserialized;
        }
    
    </cfscript>

但我想了解如何自动调用刷新令牌,因为如果令牌处于活动状态且已过期,它会给我 401 状态。

我没有得到底层行为如何自动使用刷新它然后调用 API 进行调用。

就像一样,过期时间是8900秒,所以不确定时间过期后刷新令牌是否可用或检查它是否过期,只需调用刷新令牌

我只需要一些关于如何使用它的指导

1 个答案:

答案 0 :(得分:1)

您可以构建一个拦截器,在响应状态为 401 时刷新令牌。

我在 react js 中做过这样的

axiosInstance.interceptors.response.use((response) => {
    return response
}, error => {
    const originalRequest = error.config;

    if (error.response.status === 401 && !originalRequest._retry) {
        originalRequest._retry = true;
        const refreshToken: string = localStorage.getItem('refreshToken') || '';
        const user: string = localStorage.getItem('user') || '';
        let email: string;
        if (refreshToken.length === 0 && user.length === 0) {
            return Promise.reject(error);
        }
        email = JSON.parse(user).email;
        return axiosInstance.post(refreshTokenUrl,
            {
                "email": `${email}`,
                "refreshToken": `${refreshToken}`
            }).then(res => {
            if (res.status === 200) {
                localStorage.setItem('token', res.data.token)
                const accessToken = localStorage.getItem("token");
                originalRequest.headers.authorization = 'Bearer ' + accessToken;
                return axios(originalRequest)
            }
        })
    }
});

或者您可以设置在令牌到期前刷新的计时器