【问题标题】:How to validate HTTP request in Laravel如何在 Laravel 中验证 HTTP 请求
【发布时间】: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 中将密钥放在哪里,如何检查请求?

标签: ios swift laravel


【解决方案1】:

您可以生成单个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);
       }  
     }
}

您必须在您的ios 应用程序中使用HeaderNameHeadervalue 设置Custom Header,然后您才能使用上面的代码。

谢谢。

【讨论】:

  • 我会试一试,告诉你进展如何。
  • 确定没问题
  • 快速提问:我不需要修改路线? Route::get('zip-code/{zipCode}', 'MyController@placeDescription');
  • @ Salman Zafar - 成功了,非常感谢。快速提问。如果我将自定义键值(令牌)添加到 .env 文件中,您是否看到了好处?
  • 唯一的好处是您可以在项目中的任何地方访问该 env customkey 变量,并且修改也很容易假设如果您出于某种原因必须更改值,那么您只需要更改在 .env 中
猜你喜欢
  • 1970-01-01
  • 2022-08-09
  • 2017-08-28
  • 2016-03-28
  • 1970-01-01
  • 1970-01-01
  • 2017-11-21
  • 2020-01-13
  • 2018-02-19
相关资源
最近更新 更多