ios - 使用 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;
}
解决方案
推荐阅读
- c# - 使用 OnCollisionEnter() 检测到不存在的碰撞
- java - spring boot maven jar 执行顺序不一样
- electron - 电子:在简单的 hello world 应用程序中,无法查看默认菜单栏
- javascript - useEffect 中的数据初始化触发多个请求
- sql - 如何在 3 个 SQL 表中查找不匹配的值?
- c# - 无法连接到 redis 服务器;连接超时
- css - 相对定位的内容高于粘性定位的标题
- azure-devops - Azure DevOps Nuget 管道步骤中的 Nuget 包说明
- javascript - 使用正则表达式替换html标签外的特殊字符
- apache-spark - 将 Spark 工作日志写入 stdout/stderr