在这段代码中我们指定的grant_type = password,这说明我们使用的是OAuth提供的密码认证模式。其中{"client_id", "app" }, {"client_secret", "app"}(搞过微信公众号开发的应该对这个很熟悉)用来指定客户端的身份和密钥,这边我们直接写死。
通过OAuth的请求的token主要包含四部分:
为了演示方便,我们直接把token信息直接写入到cookie中,实际项目中建议写入数据库。
4.3. 刷新token如果我们的token过期了怎么办,咱们可以用refresh_token来重新获取token。
public async Task<string> GetOAuth2TokenByRefreshToken(string refreshToken) { Uri uri = new Uri(baseUrl + oAuthTokenUrl); var handler = new HttpClientHandler() { AutomaticDecompression = DecompressionMethods.None, UseCookies = true }; using (var client = new HttpClient(handler)) { client.BaseAddress = uri; client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json")); var content = new FormUrlEncodedContent(new Dictionary<string, string>() { {"grant_type", "refresh_token"}, {"refresh_token", refreshToken}, {"client_id", "app" }, {"client_secret", "app"}, }); //获取token保存到cookie,并设置token的过期日期 var result = await client.PostAsync(uri, content); string tokenResult = await result.Content.ReadAsStringAsync(); var tokenObj = (JObject)JsonConvert.DeserializeObject(tokenResult); string token = tokenObj["access_token"].ToString(); string newRefreshToken = tokenObj["refresh_token"].ToString(); long expires = Convert.ToInt64(tokenObj["expires_in"]); this.Response.SetCookie(new HttpCookie("access_token", token)); this.Response.SetCookie(new HttpCookie("refresh_token", newRefreshToken)); this.Response.Cookies["access_token"].Expires = Clock.Now.AddSeconds(expires); return tokenResult; } }这段代码较直接使用用户名密码申请token的差别主要在参数上,{"grant_type", "refresh_token"},{"refresh_token", refreshToken}。
4.4. 使用token访问webapi有了token,访问webapi就很简单了。
public async Task<ActionResult> SendRequestWithOAuth2Token() { var token = Request.Cookies["access_token"]?.Value; if (token == null) { //throw new Exception("token已过期"); string refreshToken = Request.Cookies["refresh_token"].Value; var tokenResult = await GetOAuth2TokenByRefreshToken(refreshToken); var tokenObj = (JObject)JsonConvert.DeserializeObject(tokenResult); token = tokenObj["access_token"].ToString(); } _abpWebApiClient.RequestHeaders.Add(new NameValue("Authorization", "Bearer " + token)); return await GetUserList(baseUrl + webapiUrl); }这段代码中,我们首先从cookie中取回access_token,若access_token为空说明token过期,我们就从cookie中取回refresh_token重新申请token。然后构造一个Authorization将token信息添加到请求头即可访问目标webapi。
5. 总结本文介绍了三种不同的认证方式进行访问webapi,并举例说明。文章不可能面面俱到,省略了部分代码,请直接参考源码。若有纰漏之处也欢迎大家留言指正。
本文主要参考自以下文章:
使用OAuth打造webapi认证服务供自己的客户端使用
ABP中使用OAuth2(Resource Owner Password Credentials Grant模式)
Token Based Authentication using ASP.NET Web API 2, Owin, and Identity
posted @