/// <summary> /// 指定されたユーザーに対してアクセストークンを新規に発行します。 /// </summary> /// <param name="userId">ユーザーID</param> /// <returns>生成されたトークン</returns> public async Task <AccessToken> CreateAsync(int userId) { using (var transaction = new TransactionScope(TransactionScopeAsyncFlowOption.Enabled)) { //--- レコード追加 using (var connection = DbConnector.CreateDbConnection()) { connection.Open(); var now = DateTime.Now; var token = new T_ACCESS_TOKEN { VALUE = Guid.NewGuid().ToString(), USR_ID = userId, CREATION_TIME = now, EXPIRATION_TIME = now + AuthSettings.AccessTokenValidDuration, }; var result = await connection.InsertAsync(token).ConfigureAwait(false); if (result == 1) { transaction.Complete(); return(token.ToApiModel()); } return(null); } } }
/// <summary> /// アクセストークンをAPIモデルに変換します。 /// </summary> /// <param name="dbModel">データベースモデル</param> /// <returns>APIモデル</returns> public static AccessToken ToApiModel(this T_ACCESS_TOKEN dbModel) { if (dbModel == null) { throw new ArgumentNullException("dbModel"); } return(new AccessToken { Value = dbModel.VALUE, UserId = dbModel.USR_ID, CreationTime = dbModel.CREATION_TIME.Value, ExpirationTime = dbModel.EXPIRATION_TIME.Value, }); }
/// <summary> /// 指定されたトークンを利用しているユーザーのIDを取得します。 /// </summary> /// <param name="token">トークン</param> /// <returns>ユーザーID</returns> public async Task <int?> GetUserIdAsync(string token) { var sql = PrimitiveSql.CreateSelectSql <T_ACCESS_TOKEN>(); var parameter = new T_ACCESS_TOKEN { VALUE = token }; using (var connection = DbConnector.CreateDbConnection()) { connection.Open(); var record = (await connection.QueryAsync <T_ACCESS_TOKEN>(sql, parameter) .ConfigureAwait(false)) .FirstOrDefault(); if (record == null) { return(null); } if (record.EXPIRATION_TIME < DateTime.Now) { return(null); } return(record.USR_ID); } }