Как я могу проверить, занято ли имя пользователя на parse.com, когда все пользовательские ACL: общедоступные операции чтения / записи отключены?
Как проверить, используется ли имя пользователя с parse.com Javascript SDK, когда ACL: публичное чтение / запись отключено для всех пользователей в классе пользователя?
Объяснение: Из соображений безопасности все мои пользователи в классе / таблице User имеют собственный ACL (список контроля доступа), или, другими словами, ACL для общедоступного чтения / записи отключен, это означает, что прошедшие проверку пользователи могут читать только свою собственную информацию.
Как вы можете себе представить, любой запрос к Пользователю будет пустым для пользователей, не вошедших в систему, поэтому нет способа проверить, забрал ли пользователь пользователя с помощью Query on User Class.
Мне удается обойти это, запустив нового пользователя, а затем Parse вернет ошибку 400 с некоторой полезной информацией:
{code: 202, error: "username Test already taken"}
Проблема с этим подходом состоит в том, что я делаю проверку в реальном времени, пока пользователь печатает в поле текстовой области:
HTML AngularJS:
<form name="form">
<h3>e-mail</h3>
<input class="form-control"
name="email"
placeholder="try john.doe@mail.com or bad@domain.com"
type="email"
required ng-model="email"
ng-model-options="{ debounce: 100 }"
ui-validate="{blacklist: 'notBlackListed($value)'}"
ui-validate-async="{alreadyExists: 'doesNotExist($modelValue)'}"
>
<span ng-show='form.email.$error.blacklist'>This e-mail is black-listed!</span>
<span ng-show='form.email.$error.alreadyExists'>This e-mail is <b>already taken!</b></span>
<span ng-show='form.email.$pending'>Verifying e-mail on server...</span>
<br>is form valid: {{form.$valid}}
</form>
Javascript AngularJS:
$scope.doesNotExist = function (value) {
Parse.initialize(KEY0, KEY1);
var deferral = $q.defer();
var user = new Parse.User();
user.set("username", "Test");
user.set("password", "anyapssword");
user.signUp(null, {
success: function(user) {
// Hooray! Let them use the app now.
console.log("success!");
// Holly shit now I have to delete the user :( and wait for the full form to be submmited
user.destroy({
success: function(myObject) {
// The object was deleted from the Parse Cloud.
console.log("destroy!!!!!!!!!!!");
},
error: function(myObject, error) {
// The delete failed.
// error is a Parse.Error with an error code and message.
console.log("failed destroy!!!!!!!!!!!");
}
});
deferral.resolve(user);
},
error: function(user, error) {
console.log("Error: " + error.code + " " + error.message);
deferral.reject("mierda!");
}
});
return deferral.promise;
};
Итак, как я могу проверить, занято ли имя пользователя на parse.com, когда ACL:Public read/write отключено?
Я использую плагин AngularUI для быстрой проверки: https://htmlpreview.github.io/?https://github.com/angular-ui/ui-validate/master/demo/index.html
Спасибо!
2 ответа
Вы можете создать функцию облачного кода, которая позволяет вам проверять, взято имя пользователя или нет - вы можете искать имя пользователя с помощью masterKey(), который позволяет вам читать из таблицы User.
Дайте мне знать, если вам нужно больше информации.
Я нашел свой ответ. В случае, если кто-то смотрит здесь, что я сделал в AngularJS и Parse.com. Чтобы сэкономить время, я использую плагин Validate из AngularUI.
HTML:
<!DOCTYPE html>
<html lang="en" ng-app="demo">
<head>
<meta charset="utf-8">
<title>AngularJS ui-validate</title>
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.4.1/angular.js"></script>
<link rel="stylesheet" href="https://netdna.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.css"/>
<script type="text/javascript" src="http://www.parsecdn.com/js/parse-1.6.14.min.js"></script>
<!-- ui-validate files -->
<script src="../dist/validate.js"></script>
</head>
<body class="container">
<script>
var app = angular.module('demo', ['ui.validate']);
app.controller('ValidateCtrl', function ($scope, $timeout, $q) {
$scope.doesNotExist = function (value) {
Parse.initialize("uO...rPt", "8Bu...1mxFr");
var deferral = $q.defer();
Parse.Cloud.run('mgxIsNameAlreadyTaken', {username: value}, {
success: function (result) {
console.log("httpRequest resultado: " + result);
// result is 'Hello world!'
deferral.resolve();
},
error: function (error) {
console.log("si! ya esta tomado!: " + error);
deferral.reject();
}
});
return deferral.promise;
//return true;
};
});
</script>
<section id="validate" ng-controller="ValidateCtrl">
<div class="page-header">
<h1>Validate</h1>
</div>
<h3>What?</h3>
<div class="row">
<div class="col-md-6">
<p>The
<code>ui-validate</code> and <code>ui-validate-async</code> directives makes it very easy to create
custom validator expressions.</p>
<div class="well">
<form name="form">
<h3>e-mail</h3>
<input class="form-control"
name="email"
placeholder="try john.doe@mail.com or bad@domain.com"
type="email"
required ng-model="email"
ng-model-options="{ debounce: 500 }"
ui-validate-async="{alreadyExists: 'doesNotExist($modelValue)'}"
>
<span ng-show='form.email.$error.blacklist'>This e-mail is black-listed!</span>
<span ng-show='form.email.$error.alreadyExists'>This e-mail is <b>already taken!</b></span>
<span ng-show='form.email.$pending'>Verifying e-mail on server...</span>
<span ng-show='form.email.$valid'>This Email is Valid.</span>
<br>is form valid: {{form.$valid}}
<br>
</form>
</div>
</div>
</div>
</section>
</body>
</html>
Parse Cloud Code:
Parse.Cloud.define("mgxIsNameAlreadyTaken", function(request, response) {
Parse.Cloud.useMasterKey();
var query = new Parse.Query(Parse.User);
query.equalTo("username", request.params.username);
query.first({
success: function(user) {
if (user) {
response.error("The username has already been taken.");
} else {
response.success("The username "+request.params.username+" is available.");
}
},
error: function(error) {
console.error("Error en el query de user." + error.code + " : " + error.message);
response.error("Error in mgxIsNameAlreadyTaken: " + error.code + " : " + error.message);
}
});
});
Удачи!