无法刷新访问令牌。请重新认证

Posted

技术标签:

【中文标题】无法刷新访问令牌。请重新认证【英文标题】:Access token cannot be refreshed. Please re-authenticate 【发布时间】:2020-02-10 03:19:13 【问题描述】:

刷新访问令牌时出现此错误:

此错误之前已于 2017 年 4 月报告。OneLogin 文档指出刷新令牌可使用 45 天左右。我的刷新令牌大约有 20 小时的历史。文档是正确的还是刷新令牌的寿命较短?我可以很好地获取访问令牌和撤销令牌。

公共 RootObject RefreshToken(HttpRequesterDM rDM) RestSharp.Deserializers.JsonDeserializer deserial = new RestSharp.Deserializers.JsonDeserializer(); var client = new RestClient("https://api.us.onelogin.com/auth/oauth2/token"); var request = new RestRequest(Method.POST); string clientAuth = $"client_id:rDM.ClientID, client_secret:rDM.ClientSecret"; 字符串 accessToken = DSBase.AccessToken; 字符串 refreshToken = DSBase.refreshToken; request.AddHeader("缓存控制", "无缓存"); request.AddHeader("content-type", "application/json"); request.RequestFormat = DataFormat.Json; request.AddParameter("application/json", "\n\"grant_type\":\"refresh_token\"\n", ParameterType.RequestBody); request.AddHeader("授权", clientAuth);

        request.AddParameter("application/json", "\n\"access_token\":\" + accessToken + \"\n", ParameterType.RequestBody);
        request.AddParameter("application/json", "\n\"refresh_token\":\" + refreshToken + \"\n", ParameterType.RequestBody);
        IRestResponse response = client.Execute(request);

        RootObject returnData = deserial.Deserialize<RootObject>(response);
        if (returnData.status.message == "Access token cannot be refreshed. Please re-authenticate")
        
            RootObject rObject = GetToken(rDM);
            return rObject;
        
        if (returnData.data[0].access_token != null)
        
            access = returnData.data[0].access_token; //This correctly gets the Access Token. You should return this to a class variable so that all the  other functions can access it easily and you're not constantly passing along the variable through them.

        
        return returnData;

【问题讨论】:

【参考方案1】:

刷新令牌可以过期、被撤销、被拒绝。由于 OneLogin 是 SSO,因此用户可能已从其身份提供者注销,这导致刷新令牌无效。您将需要设计您的软件来处理错误和边缘情况。错误消息很清楚,您的用户必须再次进行身份验证。除非您发送无效/错误的刷新令牌,否则您的代码无需执行/更改/更正。

【讨论】:

我没有使用 SSO,并且刷新说明没有说明必须登录的任何内容。也就是说,当我看到此错误时,我添加了代码挂钩以重定向以获取另一个访问令牌。你是说如果我登录到 OneLogin 站点,刷新就会起作用?这种否定使用 clientID 和 Client secret。 我并不是说它会起作用。我正在解释 OAuth 的工作原理以及您的错误意味着什么。

以上是关于无法刷新访问令牌。请重新认证的主要内容,如果未能解决你的问题,请参考以下文章

OAuth - 在“社交登录”中使用刷新令牌

如何在资源请求上重新生成刷新令牌和访问令牌?

OAuth 客户端凭据重新颁发访问令牌与刷新令牌

刷新访问令牌并调用转发(操作)后不重新执行查询

函数失败后我是不是应该重新调用 API 函数并在 c# 中刷新我的访问令牌?

JWT, 为啥需要刷新令牌?