ios - 如何在 Laravel 中验证 HTTP 请求
问题描述
我有一个 iOS 应用程序正在向使用 Laravel 的服务器/站点发出 HTTP 请求,一切正常,但我想在返回任何信息之前验证 HTTP 请求。现在它的工作方式是你输入example.com/zip-code/51751
并且服务器响应请求,我想要的是让服务器只响应来自 iOS 应用程序的请求。我在想的是key/token
在我的 iOS 应用程序和 Laravel 应用程序中对随机数进行硬编码,然后将该密钥作为我的 HTTP 请求的一部分包含在内,以便我可以检查请求以查看请求中的密钥是否匹配键入服务器(.env
文件)。
这是我目前拥有的代码,可以正常工作但不进行验证。
路由文件
Route::get('zip-code/{zipCode}', 'MyController@placeDescription');
控制器
class MyController extends Controller
{
public function placeDescription($zipCode)
{
$placeInfo = InfoDB::where('ZipCode', $zipCode)->get();
return ($placeInfo);
}
}
.env 文件
APP_NAME=Laravel
APP_ENV=local
APP_KEY=base64:GpyF4XKuxMqCfkylHfdsfFDSjfasdfFDgfsdGfdsFGffhg=
APP_URL=http://localhost
LOG_CHANNEL=stack
DB_CONNECTION=sqlite
...
iOS 应用程序 / 斯威夫特
func descriptionForCurrentLocation(zipCode: String, completion:@escaping(_ placeDescription:String?) -> () ){
let siteLink = "http://example.com/zip-code/" + zipCode
let url = URL(string: siteLink)
let task = URLSession.shared.dataTask(with: url!) { data, response, error in
guard error == nil else {
// ERROR
completion(nil)
return
}
guard let data = data else {
// Return, data is empty
completion(nil)
return
}
let json = try! JSONSerialization.jsonObject(with: data, options: [])
guard let jsonArray = json as? [[String: String]] else {
// Return, the object returned by the server is not in the right format.
return
}
if jsonArray.isEmpty{
// Return, array is empty.
return
}else{
let description = jsonArray[0]["CityDescription"]!
completion(description)
}
}
task.resume()
}
如何根据随机密钥验证 HTTP 请求?
编辑:
只是为了记录,我在我的 iOS 应用程序中添加了 HTTP 标头。Salman Zafar
有关如何在 Laravel 中进行验证的详细信息,请参阅s answer。
let siteLink = "http://example.com/zip-code/" + zipCode
let url = URL(string: siteLink)
var request = URLRequest(url: url!)
request.setValue("161jshghss", forHTTPHeaderField: "CustomKey")
let task = URLSession.shared.dataTask(with: request) { data, response, error in
...
解决方案
您可以生成一个uuid
用于验证请求并验证可以使用以下代码的请求
use Illuminate\Http\Request;
class MyController extends Controller
{
public function placeDescription(Request $request, $zipCode)
{
if($request->hasHeader('CustomKey') && $request->header('CustomKey') === "161jshghss")
{
$placeInfo = InfoDB::where('ZipCode', $zipCode)->get();
return ($placeInfo);
}
else
{
return response(['error' => 'Something is missing'], 403);
}
}
}
你必须Custom Header
在你的ios
应用程序中设置HeaderName
,Headervalue
然后你可以使用上面的代码。
谢谢。
推荐阅读
- vert.x - 在springboot项目的verticles之间使用eventBus进行通信时没有地址处理程序
- c - 信号级分段错误
- amazon-web-services - 可以将 Elastic Beanstalk 从单个实例更新为负载均衡器,
- python - 嵌套列表中的元素垂直添加
- c# - Akka.NET 和 MVVM
- java - StringBuilder.delete 以有效长度失败
- database - 从 Google Cloud Firestore 快速获取数据
- c# - odbcjt32.dll 的真实路径是什么,System32 或 SysWOW64 检查它的参数
- prolog - 从变量中减去 8 时如何消除异常错误?
- ios - 在模拟器和本地设备上获取不同的时间格式 - Swift iOS