// uid と takeoverCode から GUID を引いて返す // 基本この後、GUIDを使って、LOGINしなおす public async Task <AuthData.Response> ConsumeTakeoverCode(LambdaAuthArg data) { var resp = new AuthData.Response() { status = AuthError.E_CHAOS.ToString() }; var userData = new UserData("", data.userProfile.uid); var takeover = new UserData.TakeoverCode(userData.profile, data.takeoverCode); try { var guid = await RedisClientHelper.Get(m_ctx, data.redisApiUrl, data.redisApiKey, takeover.keyField); if (guid == "") { resp.status = AuthError.E_TAKEOVER_INVALID.ToString(); return(resp); } userData.profile.guid = guid; // この時点で、引き継ぎコードを無効化する。 var redisRet = await RedisClientHelper.Set(m_ctx, data.redisApiUrl, data.redisApiKey, takeover.keyField, "", 1); resp.status = AuthError.E_OK.ToString(); resp.userProfile = userData.profile; } catch (Exception ex) { m_ctx.Log(ex.Message); resp.status = AuthError.E_CRITICAL.ToString(); resp.meta = ex.Message; } return(resp); }
public async Task <AuthData.Response> SaveData(LambdaAuthArg data) { var resp = new AuthData.Response() { status = AuthError.E_CHAOS.ToString() }; var userData = new UserData("", data.userProfile.uid); var sess = new UserData.Session(userData.profile, data.sessCode); try { // セッションチェック if (await RedisClientHelper.CheckValueEqual (m_ctx, data.redisApiUrl, data.redisApiKey, sess.keyField, sess.valueField) != RedisError.E_OK) { resp.status = AuthError.E_SESS_INVALID.ToString(); return(resp); } // S3からGUIDを取得 using (var s3Client = new AmazonS3Client(Amazon.RegionEndpoint.APNortheast1)) { var s3Req = new GetObjectRequest { BucketName = data.s3Bucket, Key = UserData.GetS3PathFromUid(data.s3DirObject, userData.profile.uid), }; var s3Resp = await s3Client.GetObjectAsync(s3Req); using (var s3Stream = new StreamReader(s3Resp.ResponseStream)){ var dataBody = s3Stream.ReadToEnd(); userData.Import(dataBody); } } // 引き継ぎコードをRedisにセット var takeover = new UserData.TakeoverCode(userData.profile); var redisRet = await RedisClientHelper.Set(m_ctx, data.redisApiUrl, data.redisApiKey, takeover.keyField, takeover.valueField, takeover.ttlSec); if (redisRet == RedisError.E_OK) { resp.status = AuthError.E_OK.ToString(); resp.takeoverCode = takeover.takeoverCode; } else { resp.status = AuthError.E_TAKEOVER_ISSUE.ToString(); resp.meta = redisRet.ToString(); m_ctx.Log(resp.status.ToString() + "," + resp.meta); } } catch (Exception ex) { m_ctx.Log(ex.Message); resp.status = AuthError.E_CRITICAL.ToString(); resp.meta = ex.Message; } return(resp); }
// Guidでログイン public async Task <AuthData.Response> Login(LambdaAuthArg data) { var resp = new AuthData.Response() { status = AuthError.E_CHAOS.ToString() }; var userData = new UserData(data.userProfile.guid); try{ using (var s3Client = new AmazonS3Client(Amazon.RegionEndpoint.APNortheast1)) { // まず、S3にUIDに対応したプロファイルがあるかチェック var s3Req = new GetObjectRequest { BucketName = data.s3Bucket, Key = UserData.GetS3PathFromUid(data.s3DirObject, userData.profile.uid), }; var s3Resp = await s3Client.GetObjectAsync(s3Req); using (var s3Stream = new StreamReader(s3Resp.ResponseStream)){ var dataBody = s3Stream.ReadToEnd(); userData.Import(dataBody); } var sess = new UserData.Session(userData.profile); // Sessionを発行して、Redisサーバに登録 var redisRet = await RedisClientHelper.Set(m_ctx, data.redisApiUrl, data.redisApiKey, sess.keyField, sess.valueField, sess.ttlSec); if (redisRet == RedisError.E_OK) { resp.status = AuthError.E_OK.ToString(); resp.userProfile = userData.profile; resp.sessCode = sess.sessCode; } else { resp.status = AuthError.E_SESS_ISSUE.ToString(); resp.meta = redisRet.ToString(); m_ctx.Log(resp.status.ToString() + "," + resp.meta); } } } catch (Exception ex) { m_ctx.Log(ex.Message); resp.status = AuthError.E_CRITICAL.ToString(); resp.meta = ex.Message; } return(resp); }
public async Task <AuthData.Response> Regist(LambdaAuthArg data) { var resp = new AuthData.Response() { status = AuthError.E_CHAOS.ToString() }; var userData = UserData.CreateNewUser(); try { using (var s3Client = new AmazonS3Client(Amazon.RegionEndpoint.APNortheast1)) { // まず、S3にUIDに対応したプロファイルを保存 var s3Req = new PutObjectRequest { BucketName = data.s3Bucket, Key = UserData.GetS3PathFromUid(data.s3DirObject, userData.profile.uid), ContentType = @"application/json", ContentBody = userData.Export() }; var s3Resp = await s3Client.PutObjectAsync(s3Req); var sess = new UserData.Session(userData.profile); // Sessionを発行して、Redisサーバに登録 var redisRet = await RedisClientHelper.Set(m_ctx, data.redisApiUrl, data.redisApiKey, sess.keyField, sess.valueField, sess.ttlSec); if (redisRet == RedisError.E_OK) { resp.status = AuthError.E_OK.ToString(); resp.userProfile = userData.profile; resp.sessCode = sess.sessCode; } else { resp.status = AuthError.E_SESS_ISSUE.ToString(); resp.meta = redisRet.ToString(); m_ctx.Log(resp.status.ToString() + "," + resp.meta); } } } catch (Exception ex) { m_ctx.Log(ex.Message); resp.status = AuthError.E_CRITICAL.ToString(); resp.meta = ex.Message; } return(resp); }
public async Task <AuthData.Response> ConsumeTakeoverCode(string uid, string takeoverCode) { var resp = new AuthData.Response() { status = AuthError.E_CHAOS.ToString() }; using (var client = new HttpClient()){ try { var request = new HttpRequestMessage(HttpMethod.Post, m_apiUrl); request.Content = new StringContent ( JsonSerializer.ToJsonString(new AuthData.Request() { role = "server", mode = "consumeTakeoverCode", userProfile = new UserData.Profile() { uid = uid }, takeoverCode = takeoverCode }) , Encoding.UTF8, @"application/json" ); request.Headers.Add(@"x-api-key", m_apiKey); var response = await client.SendAsync(request); var responseContent = await response.Content.ReadAsStringAsync(); if (!String.IsNullOrEmpty(responseContent)) { Log("Got Resp >> " + responseContent); resp = JsonSerializer.Deserialize <AuthData.Response>(responseContent); } else { resp.status = AuthError.E_CRITICAL.ToString(); } } catch (Exception e) { Log("Exception : " + e.ToString()); resp.status = AuthError.E_CRITICAL.ToString(); } } return(resp); }
async Task <AuthData.Response> ServerJob(LambdaAuthArg data, ILambdaContext ctx) { AuthData.Response ret = null; var authServer = new AuthServer(ctx); // 環境変数に依存する処理 var env = System.Environment.GetEnvironmentVariable("LAMBDA_ENV"); var service = System.Environment.GetEnvironmentVariable("LAMBDA_SERVICE"); data.s3Bucket = System.Environment.GetEnvironmentVariable("S3_BUCKET"); data.redisApiUrl = System.Environment.GetEnvironmentVariable("REDIS_API_URL"); data.redisApiKey = System.Environment.GetEnvironmentVariable("REDIS_API_KEY"); ctx.Log("s3Bucket : " + data.s3Bucket); ctx.Log("redisApiUrl : " + data.redisApiUrl); ctx.Log("redisApiKey : " + data.redisApiKey); if (data.mode == "regist") { ret = await authServer.Regist(data); } else if (data.mode == "login") { ret = await authServer.Login(data); } else if (data.mode == "createTakeoverCode") { ret = await authServer.CreateTakeoverCode(data); } else if (data.mode == "consumeTakeoverCode") { ret = await authServer.ConsumeTakeoverCode(data); } else { ret = await Task.Run(() => { return(new AuthData.Response() { status = AuthError.E_CHAOS.ToString() }); }); } return(ret); }
async Task <AuthData.Response> ClientJob(LambdaAuthArg data, ILambdaContext ctx) { AuthData.Response ret = null; var env = System.Environment.GetEnvironmentVariable("LAMBDA_ENV"); var service = System.Environment.GetEnvironmentVariable("LAMBDA_SERVICE"); data.apiUrl = System.Environment.GetEnvironmentVariable("DEBUG_API_URL"); data.apiKey = System.Environment.GetEnvironmentVariable("DEBUG_API_KEY"); var authClient = new AuthClient(data.apiUrl, data.apiKey, ctx); if (data.mode == "regist") { ret = await authClient.Regist(); } else if (data.mode == "login") { ret = await authClient.Login(data.userProfile.guid); } else if (data.mode == "createTakeoverCode") { ret = await authClient.CreateTakeoverCode(data.userProfile.uid, data.sessCode); } else if (data.mode == "consumeTakeoverCode") { ret = await authClient.ConsumeTakeoverCode(data.userProfile.uid, data.takeoverCode); } else { ret = await Task.Run(() => { return(new AuthData.Response() { status = AuthError.E_CHAOS.ToString() }); }); } return(ret); }
public override string Handler(LambdaAuthArg data, ILambdaContext context) { m_ctx = context; m_data = data; m_data.sw.Start(); m_ctx.Log(String.Format("{0:D8} : Start Process", m_data.sw.ElapsedMilliseconds)); string resp; if (data.role == "client") { Task <AuthData.Response> result = ClientJob(data, context); m_ctx.Log(String.Format("{0:D8} : Wait Async Method", m_data.sw.ElapsedMilliseconds)); resp = JsonSerializer.ToJsonString(result.Result); } else if (data.role == "server") { Task <AuthData.Response> result = ServerJob(data, context); m_ctx.Log(String.Format("{0:D8} : Wait Async Method", m_data.sw.ElapsedMilliseconds)); resp = JsonSerializer.ToJsonString(result.Result); } else { var dummyResp = new AuthData.Response() { status = AuthError.E_CHAOS.ToString() }; resp = JsonSerializer.ToJsonString(dummyResp); } m_ctx.Log(String.Format("{0:D8} : Complete Process", m_data.sw.ElapsedMilliseconds)); return(resp); }