2017-02-17 75 views
15

在我的iOS應用程序,我需要我的用戶能夠恢復/重置他們的密碼。我正在使用Drupal iOS SDK來管理用戶登錄。一切正常,但我試圖找出如何發佈用戶的電子郵件地址的服務終點,以觸發drupal密碼恢復電子郵件? 例如用戶將電子郵件輸入到UITextField中,然後點擊提交按鈕。但是,似乎沒有任何文件?iOS - 觸發密碼恢復從Drupal電子郵件

代碼如下 - 我只是不知道我應該把什麼方法放在我的sendButton? DIOSUser? DIOSSession?

DIOSUser.m

+ (void)userSendPasswordRecoveryEmailWithEmailAddress: (NSString*)email 

               success:(void (^)(AFHTTPRequestOperation *operation, id responseObject)) success 
               failure:(void (^)(AFHTTPRequestOperation *operation, NSError *error)) failure { 

    NSString *path = [NSString stringWithFormat:@"user/request_new_password/%@", email]; 
    NSLog(@"This is the input email %@", email); 

    [[DIOSSession sharedSession] sendRequestWithPath:path method:@"POST" params:nil success:success failure:failure]; 
} 

ViewController.m

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    self.forgotField.returnKeyType = UIReturnKeyDone; 
    [self.forgotField setDelegate:self]; 

    // Do any additional setup after loading the view from its nib. 

    UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(dismissKeyboard)]; 
    [self.view addGestureRecognizer:tap]; 
} 

- (IBAction)return:(id)sender { 

    [self dismissViewControllerAnimated:YES completion:nil]; 

} 
- (IBAction)sendButton:(id)sender { 

    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Retrieving Password" 
                message:@"We're helping you retrieve your password! Please check your email in a few minutes for a rescue link." 
                delegate:self 
              cancelButtonTitle:@"OK" 
              otherButtonTitles:nil]; 
    [alert show]; 

} 

錯誤日誌:

2017-07-12 22:29:34.264669-0700 myApp[4523:1331335] 
----- DIOS Failure ----- 
Status code: 404 
URL: http://url.com/endpoint01/user/request_new_password/[email protected] 
----- Response ----- 

----- Error ----- 
Request failed: not found (404) 
+0

您是否嘗試過在建議https://drupal.stackexchange.com/questions/215281/password-reset-causing-404 – Ellen

+0

提到的請嘗試我的答案,下面 – Dhiru

回答

0

我最終用下面的代碼實現了這一點 - 發佈任何其他人認爲它有用!這取決於你的數據庫結構,兩個略有不同的選擇:

- (IBAction)sendButton:(id)sender { 

    [[DIOSSession sharedSession] getCSRFTokenWithSuccess:^(AFHTTPRequestOperation *operation, id responseObject) { 
     NSString *csrfToken = [NSString stringWithUTF8String:[responseObject bytes]]; 

    NSString *email = self.forgotField.text; 

    NSString *urlString2 = [NSString stringWithFormat:@"http://myapp.com/endpoint01/user/request_new_password?name=%@", 
         email]; 
    NSDictionary *jsonBodyDict = @{@"name":email}; 
    NSData *jsonBodyData = [NSJSONSerialization dataWithJSONObject:jsonBodyDict options:kNilOptions error:nil]; 


    NSMutableURLRequest *request = [NSMutableURLRequest new]; 
    request.HTTPMethod = @"POST"; 

    // for alternative 1: 
    [request setURL:[NSURL URLWithString:urlString2]]; 
    [request setValue:@"application/json" forHTTPHeaderField:@"Content-Type"]; 
    [request setValue:@"application/json" forHTTPHeaderField:@"Accept"]; 

    [request setHTTPBody:jsonBodyData]; 

    // for alternative 2: 
    [request setURL:[NSURL URLWithString:urlString2]]; 
     [request addValue:csrfToken forHTTPHeaderField:@"X-CSRF-Token"]; 

    NSURLSessionConfiguration *config = [NSURLSessionConfiguration defaultSessionConfiguration]; 
    NSURLSession *session = [NSURLSession sessionWithConfiguration:config 
                  delegate:nil 
                delegateQueue:[NSOperationQueue mainQueue]]; 
    NSURLSessionDataTask *task = [session dataTaskWithRequest:request 
              completionHandler:^(NSData * _Nullable data, 
                   NSURLResponse * _Nullable response, 
                   NSError * _Nullable error) { 
               NSLog(@"Yay, done! Check for errors in response!"); 

               NSHTTPURLResponse *asHTTPResponse = (NSHTTPURLResponse *) response; 
               NSLog(@"The response is: %@", asHTTPResponse); 
               // set a breakpoint on the last NSLog and investigate the response in the debugger 

               // if you get data, you can inspect that, too. If it's JSON, do one of these: 
               NSDictionary *forJSONObject = [NSJSONSerialization JSONObjectWithData:data 
                               options:kNilOptions 
                               error:nil]; 
               // or 
               NSArray *forJSONArray = [NSJSONSerialization JSONObjectWithData:data 
                             options:kNilOptions 
                              error:nil]; 

              }]; 
    [task resume]; 

     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Retrieving Password" 
                 message:@"We're helping you retrieve your password! Please check your email in a few minutes for a rescue link." 
                 delegate:self 
               cancelButtonTitle:@"OK" 
               otherButtonTitles:nil]; 
     [alert show]; 

    } failure:^(AFHTTPRequestOperation *operation, NSError *error) { 

    }]; 

    } 
5

你應該簡體請執行以下操作,假設忘記字段以emailID作爲輸入,並且您有適當的驗證來檢查有效的電子郵件。

- (IBAction)sendButton:(id)sender { 

     [DIOSUser userSendPasswordRecoveryEmailWithEmailAddress:self.forgotField.text 
success:^(AFHTTPRequestOperation *operation, id responseObject) failure:^(AFHTTPRequestOperation *operation , NSError *error)){ 

     if(!error){ 
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Retrieving Password" 
                 message:@"We're helping you retrieve your password! Please check your email in a few minutes for a rescue link." 
                 delegate:self 
               cancelButtonTitle:@"OK" 
               otherButtonTitles:nil]; 
       [alert show]; 
     } 

    }]; 

} 

查找文檔here

乾杯。

+0

你真棒 - 儘管當我執行上述操作時,控制檯會引發「請求失敗 - 未找到404 - url:http:// mywebsite/myendpoint/resetpassword/enteredemailaddress」錯誤。任何想法,爲什麼這可能是? – Brittany

+0

@Brittany看起來你正在使用的SDK已經過時,請嘗試[水車](https://github.com/acquia/waterwheel.swift) – iphonic

+0

即便如此,DIOSUser的所有其他方法還是可行?這只是在這個實例中找不到的網址?那條道路應該是什麼樣的呢? – Brittany

0

您可以使用下面的代碼發送復位請求:

 - (IBAction)sendButton:(id)sender { 

    [DIOSUser userSendPasswordRecoveryEmailWithEmailAddress:self.txtForgotPassword.text 
                    success:^(AFHTTPRequestOperation *operation, id responseObject) { 
    // Success Block 
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Retrieving Password" message:@"We have send you reset link to your email Please check your email." delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
     [alert show]; 


     }failure:^(AFHTTPRequestOperation *operation , NSError *error){ 

    // Failure Block 
       if(!error){ 
     // error.description 
     UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Oopss" message: error.description delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
     [alert show]; 

      } 
       }]; 
    } 

我希望這會幫助你。