diff options
author | 杨宇千 <crupest@outlook.com> | 2019-08-01 22:32:40 +0800 |
---|---|---|
committer | 杨宇千 <crupest@outlook.com> | 2019-08-01 22:32:40 +0800 |
commit | 9aeca6f6adf1a20d85e1fdbc8bdc8dfb35be28c1 (patch) | |
tree | abbdb97d24c2e6d7c32433887643676637011720 /Timeline/Services | |
parent | ee506e832e19e84cba2f9cf1c2b0172ca3e092b6 (diff) | |
download | timeline-9aeca6f6adf1a20d85e1fdbc8bdc8dfb35be28c1.tar.gz timeline-9aeca6f6adf1a20d85e1fdbc8bdc8dfb35be28c1.tar.bz2 timeline-9aeca6f6adf1a20d85e1fdbc8bdc8dfb35be28c1.zip |
Add token expire time.
Diffstat (limited to 'Timeline/Services')
-rw-r--r-- | Timeline/Services/Clock.cs | 32 | ||||
-rw-r--r-- | Timeline/Services/JwtService.cs | 8 | ||||
-rw-r--r-- | Timeline/Services/UserService.cs | 7 |
3 files changed, 41 insertions, 6 deletions
diff --git a/Timeline/Services/Clock.cs b/Timeline/Services/Clock.cs new file mode 100644 index 00000000..98451ad9 --- /dev/null +++ b/Timeline/Services/Clock.cs @@ -0,0 +1,32 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; + +namespace Timeline.Services +{ + /// <summary> + /// Convenient for unit test. + /// </summary> + public interface IClock + { + /// <summary> + /// Get current time. + /// </summary> + /// <returns>Current time.</returns> + DateTime GetCurrentTime(); + } + + public class Clock : IClock + { + public Clock() + { + + } + + public DateTime GetCurrentTime() + { + return DateTime.Now; + } + } +} diff --git a/Timeline/Services/JwtService.cs b/Timeline/Services/JwtService.cs index f3416cce..52e892f6 100644 --- a/Timeline/Services/JwtService.cs +++ b/Timeline/Services/JwtService.cs @@ -94,10 +94,12 @@ namespace Timeline.Services private readonly IOptionsMonitor<JwtConfig> _jwtConfig; private readonly JwtSecurityTokenHandler _tokenHandler = new JwtSecurityTokenHandler(); + private readonly IClock _clock; - public JwtService(IOptionsMonitor<JwtConfig> jwtConfig) + public JwtService(IOptionsMonitor<JwtConfig> jwtConfig, IClock clock) { _jwtConfig = jwtConfig; + _clock = clock; } public string GenerateJwtToken(TokenInfo tokenInfo, DateTime? expires = null) @@ -118,8 +120,8 @@ namespace Timeline.Services Audience = config.Audience, SigningCredentials = new SigningCredentials( new SymmetricSecurityKey(Encoding.ASCII.GetBytes(config.SigningKey)), SecurityAlgorithms.HmacSha384), - IssuedAt = DateTime.Now, - Expires = expires.GetValueOrDefault(DateTime.Now.AddSeconds(config.DefaultExpireOffset)) + IssuedAt = _clock.GetCurrentTime(), + Expires = expires.GetValueOrDefault(_clock.GetCurrentTime().AddSeconds(config.DefaultExpireOffset)) }; var token = _tokenHandler.CreateToken(tokenDescriptor); diff --git a/Timeline/Services/UserService.cs b/Timeline/Services/UserService.cs index 3164a645..328dbff0 100644 --- a/Timeline/Services/UserService.cs +++ b/Timeline/Services/UserService.cs @@ -58,11 +58,12 @@ namespace Timeline.Services /// </summary> /// <param name="username">The username of the user to anthenticate.</param> /// <param name="password">The password of the user to anthenticate.</param> + /// <param name="expires">The expired time point. Null then use default. See <see cref="JwtService.GenerateJwtToken(TokenInfo, DateTime?)"/> for what is default.</param> /// <returns>An <see cref="CreateTokenResult"/> containing the created token and user info.</returns> /// <exception cref="ArgumentNullException">Thrown when <paramref name="username"/> or <paramref name="password"/> is null.</exception> /// <exception cref="UserNotExistException">Thrown when the user with given username does not exist.</exception> /// <exception cref="BadPasswordException">Thrown when password is wrong.</exception> - Task<CreateTokenResult> CreateToken(string username, string password); + Task<CreateTokenResult> CreateToken(string username, string password, DateTime? expires = null); /// <summary> /// Verify the given token. @@ -170,7 +171,7 @@ namespace Timeline.Services _memoryCache.Remove(GenerateCacheKeyByUserId(id)); } - public async Task<CreateTokenResult> CreateToken(string username, string password) + public async Task<CreateTokenResult> CreateToken(string username, string password, DateTime? expires) { if (username == null) throw new ArgumentNullException(nameof(username)); @@ -198,7 +199,7 @@ namespace Timeline.Services { Id = user.Id, Version = user.Version - }); + }, expires); return new CreateTokenResult { Token = token, |