首页 > 解决方案 > 使用 swift + laravel + JWT 注册 & 登录 & 注销

问题描述

我正在开发 iOS 应用程序,后端是 laravel,我正在尝试通过 JWT 创建一个完整的用户管理身份验证 API。

我为此找到了一些代码,并在 laravel 和 JWT 中遵循本教程 https://medium.com/mesan-digital/tutorial-4-how-to-build-a-laravel-5-4-jwt-powered-mobile-应用程序-api-4c59109d35f

在 laravel AuthController.php 我使用此代码注册:

  public function register(Request $request)
   {
       $credentials = $request->only('name', 'email', 'password' , 'usertype');
       $rules = [
           'name' => 'required|max:255',
           'email' => 'required|email|max:255|unique:users',
           'password' => 'required|min:6',
       ];
       $validator = Validator::make($credentials, $rules);
       if($validator->fails()) {
           return response()->json(['success'=> false, 'error'=> $validator->messages()]);
       }
       $name = $request->name;
       $email = $request->email;
       $password = $request->password;
       User::create(['name' => $name, 'email' => $email, 'password' => Hash::make($password)]);
       return $this->login($request);
     }

并迅速使用此代码进行注册:

let myUrl: NSURL

        myUrl = NSURL(string: rigesterUrl)!;

        let request = NSMutableURLRequest(url:myUrl as URL);
        request.httpMethod = "POST";

        let param = [
            "name" : name,
            "email"    : email,
            "password"    : password,
            ] as [String : String]?

        let boundary = generateBoundaryString()

        request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")


        request.httpBody = createBodyWithParameters(parameters: param, filePathKey: "file[]",  boundary: boundary) as Data

        let task = URLSession.shared.dataTask(with: request as URLRequest) {
            data, response, error in


            if error != nil {
                print("error=\(error)")
                return
            }else {

                do {



                    let jsonResult = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as! NSDictionary


                    let resultValue = jsonResult["success"] as! Bool

                    print("result: \(resultValue)")
                    let data = jsonResult["data"] as! NSDictionary;
                    guard let token = data["token"] else { return }

                    if (resultValue == true) {

                        UserDefaults.standard.set(token, forKey: "token");

                        UserDefaults.standard.synchronize();
                        DispatchQueue.main.async(execute: {

                    }else{
                        DispatchQueue.main.async(execute: {
                            ///dislpay alert message

                        })
                    }
                } catch let error as NSError {
                    print(error.localizedDescription)
                }


            }
        }

这对我很好

登录我在 laravel 中使用此代码

public function login(Request $request)
    {
      $credentials = $request->only('email', 'password');


              $rules = [
                  'email' => 'required|email',
                  'password' => 'required',
              ];
              $validator = Validator::make($credentials, $rules);
              if($validator->fails()) {
                  return response()->json(['success'=> false, 'error'=> $validator->messages()]);
              }
              try {
                  // attempt to verify the credentials and create a token for the user
                  if (!$token = JWTAuth::attempt($credentials)) {
                      return response()->json(['success' => false, 'error' => 'We cant find an account with this credentials.'], 401);
                  }
              } catch (JWTException $e) {
                  // something went wrong whilst attempting to encode the token
                  return response()->json(['success' => false, 'error' => 'Failed to login, please try again.'], 500);
              }
                // all good so return the token
                return response()->json(['success' => true, 'data'=> [ 'token' => $token ]]);

    }

我很快就使用了这段代码:

 let myUrl: NSURL

            myUrl = NSURL(string: loginUrl)!;


            let request = NSMutableURLRequest(url:myUrl as URL);
            request.httpMethod = "POST";

            let param = [
                "email" : email,
                "password"  : pass
                ] as [String : String]?

            let boundary = generateBoundaryString()

            request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")


            request.httpBody = createBodyWithParameters(parameters: param, filePathKey: "file[]",  boundary: boundary) as Data
let task = URLSession.shared.dataTask(with: request as URLRequest) {
                data, response, error in


                if error != nil {
                    print("error=\(error)")
                    return
                }else {

                    do {
 let jsonResult = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as! NSDictionary

                        print (jsonResult)

                        let resultValue = jsonResult["success"] as! Bool
                       // let token = data["token"];

                        print("result: \(resultValue)")

                        if (resultValue == true) {
                            let data = jsonResult["data"] as! NSDictionary;

                            guard let token = data["token"] as? String else { return }

                            print ("token \(token)")
}
} catch let error as NSError {
                        print(error.localizedDescription)
                    }


                }
            }

            task.resume()
        }

登录也正常,

我的问题是注销,我在 laravel 中使用此代码:

public function logout(Request $request)
    {
      $this->validate($request, ['token' => 'required']);
     try {
         JWTAuth::invalidate($request->input('token'));
         return response()->json(['success' => true, 'message'=> "You have successfully logged out."]);
     } catch (JWTException $e) {
         // something went wrong whilst attempting to encode the token
         return response()->json(['success' => false, 'error' => 'Failed to logout, please try again.'], 500);
     }

    }

我很快就尝试使用它:

let myUrl: NSURL

        myUrl = NSURL(string: loginUrl)!;


        let request = NSMutableURLRequest(url:myUrl as URL);
        request.httpMethod = "POST";

        let param = ["token" : token] as [String : String]?

        let boundary = generateBoundaryString()

        request.setValue("multipart/form-data; boundary=\(boundary)", forHTTPHeaderField: "Content-Type")


        request.httpBody = createBodyWithParameters(parameters: param, filePathKey: "file[]",  boundary: boundary) as Data

 let task = URLSession.shared.dataTask(with: request as URLRequest) {
            data, response, error in


            if error != nil {
                print("error=\(error)")
                return
            }else {

                do {
                    print ("test2")



                    let jsonResult = try JSONSerialization.jsonObject(with: data!, options: .mutableContainers) as! NSDictionary

                    print (jsonResult)

                    let resultValue = jsonResult["success"] as! Bool
 print("result: \(resultValue)")

                    if (resultValue == true) {
 }else{
                        DispatchQueue.main.async(execute: {
                            ///dislpay alert message
                            let message = "error log out";

                        })
                    }
                } catch let error as NSError {
                    print(error.localizedDescription)
                }


            }
        }

        task.resume()

但是返回了一个错误:

{
    error = "Failed to logout, please try again.";
    success = 0;
}

标签: iosswiftlaraveljwt

解决方案


推荐阅读