HTML5技术

ABP入门系列(16)——通过webapi与系统进行交互 - 『圣杰』(4)

字号+ 作者:H5之家 来源:H5之家 2017-04-25 09:04 我要评论( )

在这段代码中我们指定的grant_type = password,这说明我们使用的是OAuth提供的密码认证模式。其中{client_id, app }, {client_secret, app}(搞过微信公众号开发的应该对这个很熟悉)用来指定客户端的身份和密钥,

在这段代码中我们指定的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 @

 

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

相关文章
  • Android -- 带你从源码角度领悟Dagger2入门到放弃(一) - 阿呆哥哥

    Android -- 带你从源码角度领悟Dagger2入门到放弃(一) - 阿呆哥哥

    2017-04-21 11:02

  • require.js入门 - 爱喝酸奶的吃货

    require.js入门 - 爱喝酸奶的吃货

    2017-04-14 13:05

  • Docker基础入门及示例 - KevinCC

    Docker基础入门及示例 - KevinCC

    2017-03-16 12:01

  • 小白学习H5从入门到放弃 - strength小宝

    小白学习H5从入门到放弃 - strength小宝

    2017-02-27 16:01

网友点评