三、认证流程
大概的流程是这样的:
认证服务器:用于用户的登录验证和Token的发放。
应用服务器:业务数据接口。被保护的API。
客户端:一般为APP、小程序等。
认证流程:
用户首先通过登录,到认证服务器获取一个Token。
在访问应用服务器的API的时候,将获取到的Token放置在请求的Header中。
应用服务器验证该Token,通过后返回对应的结果。
说明:这只是示例方案,实际项目中可能有所不同。
对于小型项目,可能认证服务和应用服务在一起。本例通过分开的方式来实现,使我们能更好的了解二者之间的认证流程。
对于复杂一些的项目,可能存在多个应用服务,用户获取到的Token可以在多个分布式服务中被认证,这也是JWT的优势之一。
关于JWT的文章很多,这里就不做过多介绍了。下面通过实际的例子来看一下 它是如何在ASP.NET Core 中应用的。
四、应用实例
上一节的图:“JWT的认证流程”中涉及到客户端、认证服务器、应用服务器三部分,下面通过示例来对这三部分进行模拟:
认证服务器:新建一个WebApi的解决方案,名为FlyLolo.JWT.Server。
应用服务器:新建一个WebApi的解决方案,名为FlyLolo.JWT.API。
客户端:这里用Fiddler发送请求做测试。
认证服务
首先新建一个ASP.NET Core 的解决方案WebApi的解决方案
将其命名为FlyLolo.JWT.Server。
首先新建一个TokenController用于登录和Token的发放:
[Route("api/[controller]")] public class TokenController : Controller { private ITokenHelper tokenHelper = null; public TokenController(ITokenHelper _tokenHelper) { tokenHelper = _tokenHelper; } [HttpGet] public IActionResult Get(string code, string pwd) { User user = TemporaryData.GetUser(code); if (null != user && user.Password.Equals(pwd)) { return Ok(tokenHelper.CreateToken(user)); } return BadRequest(); } }
它有个名为Get的Action用于接收提交的用户名和密码,并进行验证,验证通过后,调用TokenHelper的CreateToken方法生成Token返回。
这里涉及到了User和TokenHelper两个类。
User相关:
1.public class User { public string Code { get; set; } public string Name { get; set; } public string Password { get; set; } }
由于只是Demo,User类只含有以上三个字段。在TemporaryData类中做了User的模拟数据
/// <summary> /// 虚拟数据,模拟从数据库或缓存中读取用户 /// </summary> public static class TemporaryData { private static List<User> Users = new List<User>() { new User { Code = "001", Name = "张三", Password = "111111" }, new User { Code = "002", Name = "李四", Password = "222222" } }; public static User GetUser(string code) { return Users.FirstOrDefault(m => m.Code.Equals(code)); } }
这只是模拟数据,实际项目中应该从数据库或者缓存等读取。