Я работаю над приложением для iOS, бэкэнд - laravel, и я пытаюсь создать полный API аутентификации управления пользователями с помощью JWT.
Я нашел некоторый код для этого и следую этому уроку вlaravel и JWT https://medium.com/mesan-digital/tutorial-4-how-to-build-a-laravel-5-4-jwt-powered-mobile-app-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);
}
и в Swift я использую этот коддля регистрации:
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 ]]);
}
и в swift я использую этот код:
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);
}
}
и в swift я пытаюсь использовать это:
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;
}