【发布时间】:2019-08-25 19:48:02
【问题描述】:
我有一个 iOS 应用程序正在向使用 Laravel 的服务器/站点发出 HTTP 请求,一切正常,但我想在返回任何信息之前验证 HTTP 请求。现在它的工作方式是你输入example.com/zip-code/51751然后服务器响应请求,我想要的是让服务器只响应来自iOS应用程序的请求。我在想的是在我的 iOS 应用程序和 Laravel 应用程序中硬编码一个随机的key/token,然后将该密钥作为我的 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 应用/Swift
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 标头。有关如何在 Laravel 中进行验证的详细信息,请参阅 Salman Zafars 答案。
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
...
【问题讨论】:
-
如果你有用户注册,这可以通过任何方式完成,那么最好的方法是使用
laravel passport or jwt,如果你没有它,那么你可以为每个 ios 设备使用随机密钥,如果你如果没有注册它,那么您可以生成一个uuid,您可以通过在自定义标头中添加uuid来验证它,然后您可以验证它 -
我不想使用用户身份验证,换句话说我不希望用户必须登录。每台 iOS 设备的密钥都可以相同,而不必每台设备都是唯一的。
-
检查hte请求中的headers,查找ios标识符
-
所以只需生成一个
uuid然后将该键添加到您的标题中作为自定义标题并使用它进行验证 -
嗯,是的,验证部分是我不知道该怎么做,我在 Laravel 中将密钥放在哪里,如何检查请求?