public dynamic Respond() { var task = DatabaseContext.Instance.UserExists(model.AuthenticatedClient.ProviderName, model.AuthenticatedClient.UserInformation.Email); task.ConfigureAwait(false); // For running async methods synchronously. var result = task.Result; Debug.WriteLine("UserExists: " + result); if (result) { Debug.WriteLine("User exists, now retrieving user."); var userTask = DatabaseContext.Instance.GetUser(model.AuthenticatedClient.ProviderName, model.AuthenticatedClient.UserInformation.Email); UserModel user = userTask.Result; if (!Utils.Instance.TokenExpired(user.AuthToken.Value.ToDateTimeFromEpoch())) //IF the AuthToken is not expired. { // Retrieving existing AuthToken. var respone = new RegisterLoginModel(user.UserId, user.AuthToken.Key, Utils.Instance.SecondsfromNow(user.AuthToken.Value.ToDateTimeFromEpoch())); return JsonConvert.SerializeObject(respone); } else { // Updating AuthToken+Timestamp. string token = Convert.ToBase64String(Guid.NewGuid().ToByteArray()); user.AuthToken = new KeyValuePair<string, long>(token, DateTime.Now.ToEpochTime()); DatabaseContext.Instance.UpdateAuthToken(user); var response = new RegisterLoginModel(user.UserId, user.AuthToken.Key, Utils.Instance.SecondsfromNow(user.AuthToken.Value.ToDateTimeFromEpoch())); return JsonConvert.SerializeObject(response); } } else { // Creating new user. Debug.WriteLine("User doesn't exists, new user being created."); UserModel newUser = new UserModel() { UserId = Guid.NewGuid().ToString(), AuthProvider = model.AuthenticatedClient.ProviderName, AuthId = model.AuthenticatedClient.UserInformation.Email, AuthToken = new KeyValuePair<string,long>(Convert.ToBase64String(Guid.NewGuid().ToByteArray()), DateTime.Now.AddDays(1).ToEpochTime()) }; Debug.WriteLine(newUser); DatabaseContext.Instance.AddUser(newUser); var response = new RegisterLoginModel() { user_id = newUser.UserId, auth_token = newUser.AuthToken.Key, seconds = Utils.Instance.SecondsfromNow(newUser.AuthToken.Value.ToDateTimeFromEpoch()) }; return JsonConvert.SerializeObject(response); } }
public dynamic RespondToIDToken() { BsonDocument tokeninfo; try { SaveRefreshToken(); tokeninfo = BsonDocument.Parse(ValidateToken()); loginRequestModel.auth_id = (string)tokeninfo["email"]; Debug.WriteLine("Response from Google tokeninfo endpoint: " + tokeninfo); } catch (Exception ex) { return "Oops, an error occured. Details: " + ex.Message; } if (tokeninfo.Contains("error_description")) { // ID token invalid. return new BsonDocument{ {"status", "error"}, {"description", "Invalid ID token"} }; } else if ((string)tokeninfo["email"]!=loginRequestModel.auth_id) { // Email provided by the client and auth provider doesn't match. return new BsonDocument{ {"status", "error"}, {"description", "Email ID mismatch"} }; } else { var task = DatabaseContext.Instance.UserExists(loginRequestModel.auth_provider,loginRequestModel.auth_id); task.ConfigureAwait(false); // For running async methods synchronously. var result = task.Result; Debug.WriteLine("UserExists: " + result); if (result) { Debug.WriteLine("User exists, now retrieving user."); var userTask = DatabaseContext.Instance.GetUser(loginRequestModel.auth_provider, loginRequestModel.auth_id); UserModel user = userTask.Result; // Updating AuthToken+Timestamp. string token = Convert.ToBase64String(Guid.NewGuid().ToByteArray()); user.AuthToken = new KeyValuePair<string, long>(token, DateTime.Now.ToEpochTime()); DatabaseContext.Instance.UpdateAuthToken(user); var response = new RegisterLoginModel(user.UserId, user.AuthToken.Key, Utils.Instance.SecondsfromNow(user.AuthToken.Value.ToDateTimeFromEpoch())); return JsonConvert.SerializeObject(response); } else { // Creating new user. Debug.WriteLine("User doesn't exists, new user being created."); UserModel newUser = new UserModel() { UserId = Guid.NewGuid().ToString(), AuthProvider = loginRequestModel.auth_provider, AuthId = loginRequestModel.auth_id, IdToken = loginRequestModel.id_token, AuthToken = new KeyValuePair<string, long>(Convert.ToBase64String(Guid.NewGuid().ToByteArray()), DateTime.Now.AddDays(1).ToEpochTime()), AuthCode = loginRequestModel.server_auth_code }; Debug.WriteLine(newUser); DatabaseContext.Instance.AddUser(newUser); var response = new RegisterLoginModel() { user_id = newUser.UserId, auth_token = newUser.AuthToken.Key, seconds = Utils.Instance.SecondsfromNow(newUser.AuthToken.Value.ToDateTimeFromEpoch()) }; return JsonConvert.SerializeObject(response); } } }