Пример #1
0
        // 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);
        }
Пример #2
0
        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);
        }
Пример #3
0
        // 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);
        }
Пример #4
0
        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);
        }
Пример #5
0
        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);
        }
Пример #6
0
        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);
        }
Пример #7
0
        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);
        }
Пример #8
0
        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);
        }