如何通过带参认证方法获取Token并应用到无账号密码的其他API请求头
解决思路
首先修正现有代码的隐藏错误:请求头中Bearer和Token之间缺少空格,会直接导致服务端识别认证信息失败,正确格式应为Bearer {token}。
针对调用其他API时无法获取login、pwd参数的问题,可采用以下几种方案:
- 方案一:Token缓存机制(最常用)
在TokenClass中新增静态字段缓存已获取的有效Token和过期时间,仅在首次登录或Token过期时需要传入账号密码,后续所有API请求直接读取缓存的Token即可。
改造后的TokenClass示例代码如下:
public static class TokenClass { // 缓存有效Access Token private static string _cachedAccessToken; // Token过期时间,默认提前1分钟过期,避免使用临界过期的Token private static DateTime _tokenExpireTime = DateTime.MinValue; private const string LoginUrl = "你的登录接口地址"; private static readonly RestClient _client = new RestClient(); // 仅首次登录时调用,传入账号密码获取Token并缓存 public static void Login(string login, string pwd) { var restRequest = new RestRequest(LoginUrl, Method.GET); restRequest.AddHeader("X-Requested-With", "XMLHttpRequest"); restRequest.AddHeader("Authorization", "Basic ZRZEFSFCSDFSFSDFSDS"); restRequest.AddParameter("username", login); restRequest.AddParameter("password", pwd); IRestResponse response = _client.Execute(restRequest); var jObject = JObject.Parse(response.Content); _cachedAccessToken = jObject.GetValue("access_token").ToString(); // 从登录返回结果取有效期,若接口未返回可按服务端规则手动设置,比如默认2小时 int expireSeconds = jObject.GetValue("expires_in").ToObject<int>(); _tokenExpireTime = DateTime.Now.AddSeconds(expireSeconds).AddMinutes(-1); } // 其他API请求调用该方法获取有效Token,无需传账号密码 public static string GetValidToken() { if (string.IsNullOrEmpty(_cachedAccessToken) || DateTime.Now >= _tokenExpireTime) { // 存在RefreshToken机制可在此处调用刷新接口,无则抛出异常提示需要重新登录 throw new InvalidOperationException("凭证已过期,请重新登录"); } return _cachedAccessToken; } }
后续API请求添加认证头的代码修改为:
restRequest.AddParameter("Authorization", $"Bearer {TokenClass.GetValidToken()}", ParameterType.HttpHeader);
方案二:RefreshToken自动续期(安全性最高)
若服务端支持OAuth2等标准认证体系,登录接口会同时返回access_token和refresh_token,将两个值都缓存下来,当access_token过期时,直接用refresh_token调用刷新接口获取新的有效access_token,全程不需要重新传入账号密码,安全性远高于缓存账号密码的方案。方案三:加密存储账号密码(兜底方案,不推荐)
若服务端没有RefreshToken机制且需要长期自动续期,可以将账号密码对称加密后存储在本地安全区域(比如加密配置文件、系统用户私有目录),Token过期时读取加密信息解密后重新调用登录接口获取新Token,该方案存在账号密码泄露风险,仅适合内部非敏感工具类项目使用。
内容的提问来源于stack exchange,提问作者Patricia
相关产品推荐
相关产品推荐

