Parse.com&小型企业应用:使用产品密钥的最佳做法

时间:2015-04-22 09:44:25

标签: ios objective-c authentication parse-platform push-notification

我在一个应用程序中使用Parse SDK,用于拥有大约3000名客户的小型企业。我使用内置类PFUser在首次启动时注册所有用户,但我还需要:

  • 限制应用的用户/客户端(总数)
  • 授予业务人员特权,允许他们(通过自己的设备)向所有商店客户发送远程通知

为此,我正在考虑这个过程:

  1. 我生成一个“userKey”列表。每个userKey是一个由15个字符组成的字符串,包括数字,小写和大写。我计划从(免费)网站生成这些密钥。
  2. 我在Parse数据库中上传了这些userKeys。每个userKey都将存储为UserKey类的实例。我会手动将列/属性“isAdmin”(布尔值)设置为TRUE到给定数量的userKeys(比如说8-10)。所有其他键将这些属性设置为FALSE。
  3. 我将这组userKeys提供给业务所有者。然后她有一定数量的“客户”用户键,比如990,还有10个“admin”用户键。
  4. 无论用户是谁,当第一次在设备上启动应用程序时,系统会提示她登录(事实上,我正在考虑检查[PFUser currentUser]是否已经缓存在磁盘上?如果没有,显示logIn / signIn页面。)
  5. 此新用户输入她的邮件地址作为她的用户名,密码以及业务所有者提供的userKey。
  6. 邮件,密码和userKey输入格式是正确的(使用正则表达式检查),我查询用户输入的具有相同ID的UserKey(存储在Parse DB上)
  7. 如果此UserKey甚至不存在,我会显示警告
  8. 此UserKey存在,我查看其“user”属性,即带有KVC表示法的userKey [@“user”]
  9. 如果设置了此字段,则表示输入的userKey已链接到PFUser(即已将其提供给商店的客户端)。我显示并提醒。
  10. 如果未设置userKey [@“user”],则userKey为“空闲”。最后一步是要知道这个新用户是商店的员工,还是只是客户。
  11. 我查看了userKey [@“admin”],其中admin是手动输入的布尔值。如果userKey [@“admin”] = TRUE,那么我授权此PFUser(现在缓存在磁盘上)发送远程通知。
  12. 代码如下所示:

    - (void)signUpNewUser {
    
    NSString *userMail = self.mailTextField.text;
    NSString *userPassword = self.passwordTextField.text;
    NSString *userKeyInput = self.userKeyTextField.text;
    
    // == 1. Check Mail ==
    if (![self validateEmail:userMail]) {
        [self showAlertWithTitle:@"Mail invalide" subTitle:@"Entrez une adresse mail valide."];
        return;
    }
    // == 2. Check Password ==
    if ([self validatePassword:userPassword]) {
    
        // == 3. Check UserKey Input Format ==
        if ([self validateUserKeyFormat:userKeyInput]) {
    
            // == 4. Check if this UserKey exists ==
            PFQuery *userKeyQuery = [PFQuery queryWithClassName:@"UserKey"];
            [userKeyQuery whereKey:@"userKeyString" equalTo:userKeyInput];
    
            PFObject *fetchedUserKey = [userKeyQuery getFirstObject];
    
            // == 4.1. UserKey does not exist ==
            if (!fetchedUserKey) {
                [self showAlertWithTitle:@"Clé inconnue" subTitle:@"La clé saisie n'existe pas. Demandez au responsable du Club une clé personnelle différente."];
                return;
            }
    
            // == 4.2. UserKey exists, check if it is available ==
            if (fetchedUserKey) {
    
                // == 5.1. UserKey is already taken ==
                if (fetchedUserKey[@"user"] != nil) {
                    [self showAlertWithTitle:@"Clé déjà utilisée" subTitle:@"La clé saisie est déjà utilisée par un autre membre du Club. Demandez au responsable du Club une clé personnelle différente."];
                    return;
                }
    
                // == 5.2. UserKey is free. Create new PFUser, link with userKey & signUp ==
                if (fetchedUserKey[@"user"] == nil) {
    
                    PFUser *newUser = [PFUser user];
                    newUser.username = userMail;
                    newUser.password = userPassword;
                    newUser[@"isAdmin"] = fetchedUserKey[@"isAdmin"];
    
                    [newUser signUpInBackgroundWithBlock:^(BOOL succeeded, NSError *error) {
    
                        if (error) {
                            NSLog(@"\n\n ** signUp ErrorDesc: %@\nError Code= %i",error.localizedDescription,error.code);
                        }
                        if (!error) {
                            NSLog(@"\n\n ** signUp SUCCESS!");
    
                            // I assume Parse will automatically create a One-to-One relationship between the UserKey and the PFUser. Am I right ?
                            fetchedUserKey[@"user"] = newUser;
                            [fetchedUserKey save];
    
                            newUser[@"userKey"] = fetchedUserKey;
                            [newUser save];
    
                            [self dismissViewControllerAnimated:YES completion:nil];
                        }
                    }];
                }
            }
        }
    }
    }
    

    我已经测试了代码,它运行正常并处理各种情况(iPhone丢失,输入格式错误,已经使用了userKey等)。

    但是因为这是我第一次在身份验证时限制用户访问权限,所以我想知道这种做事方式是否正确。

0 个答案:

没有答案