0

ユーザーのクラス内のすべてのユーザーで ACL:Public read/write が無効になっている場合、parse.com Javascript SDK でユーザー名が取得されているかどうかを確認するにはどうすればよいですか?

説明: セキュリティ上の理由から、クラス/テーブル ユーザーのすべてのユーザーにはプライベートACL (アクセス制御リスト) があります。つまり、パブリック読み取り/書き込みの ACL が無効になっています。これは、認証されたユーザーが自分の情報のみを読み取ることができることを意味します。

想像できるように、ユーザーへのクエリはログインしていないユーザーには空になるため、ユーザークラスでクエリを使用してユーザーが既に取得されているかどうかを確認する方法はありません

新しいユーザーをsingUpすることでこれを回避することができました.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;
        };

では、ACL:Public read/write が無効になっているときに、ユーザー名が parse.com で使用されているかどうかを確認するにはどうすればよいですか?

検証を高速化するために AngularUI プラグインを使用しています: https://htmlpreview.github.io/?https://github.com/angular-ui/ui-validate/master/demo/index.html

ありがとう!

4

2 に答える 2

0

ユーザー名が使用されているかどうかを確認できるクラウド コード関数を作成できます。masterKey() を使用してユーザー名を検索すると、User テーブルから読み取ることができます。

さらに情報が必要な場合はお知らせください。

于 2016-01-16T05:27:42.133 に答える
0

私は自分の答えを見つけました。AngularJS と Parse.com で私が行ったことを誰かがここで見ている場合に備えて。時間を節約するために、AngularUI の Validate プラグインを使用しています。

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.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);
        }
    });
});

幸運を!

于 2016-01-17T15:27:52.463 に答える