【问题标题】:What is your alternative for not using session in REST API in this case在这种情况下,不使用 REST API 中的会话的替代方法是什么
【发布时间】:2022-08-18 17:44:50
【问题描述】:

我正在为我的 API 控制器使用这种方法:

public function register(Request $request)
    {
        // Validation Data
        $validData = $this->validate($request, [
            \'user_input\' => \'required|regex:/^09\\d{9}$/|max:11|min:11\',
            \'user_full_name\' => \'nullable|max:20|min:3\',
        ]);
        
        Session::put(\'user_full_name\', $request->user_full_name);
        
        $sms = new SendSms(request()->all()[\'user_input\'],43,request()->all());
        $sms->send();
        
        return response([
            \'data\' => \'verification code is sent\',
            \'status\' => 200
        ]);
    }

如您所见,我在包含用户名的方法中设置了一个会话:

Session::put(\'user_full_name\', $request->user_full_name);

但这是错误的,因为我没有使用 REST API 的好处,而且 REST 不应该与会话一起提供。

而且我确实需要知道输入的用户名并为下一步获取该数据,这就是我使用会话的原因。

所以问题是在 REST API 中适合和标准的替代方法是什么?

  • 所以不要把它放在会话中,为什么你仍然需要它?
  • @Justinas那我怎么能理解客户输入的用户名并用给定的数据注册他!
  • 在保留当前用户信息的地方编写特殊服务。然后到$this->auth->getFullName(),因为每个请求都必须经过授权才能访问,因为REST Api的无状态特性
  • 但是你把名字放在第一位的目的是什么!
  • 由于这是一个 API,您始终可以从 api tokenJWT token 或您正在使用的任何身份验证方法中获取全名!!

标签: php laravel api rest laravel-5.8


【解决方案1】:

我们将会话数据与每个请求一起发送,而不是服务器端会话。这使得通信无状态且可扩展。就技术而言,最简单的方法是在 Authorization header 中随每个请求发送用户名和密码。更复杂的是,在使用用户名和密码第一次成功验证后,服务器使用例如用户 ID 设置不同的值并使用其私钥对其进行签名。在下一个请求中,客户端可以将用户 ID 连同签名一起发回,服务器可以用公钥检查它是否由私钥签名。您甚至可以将签名提供服务与签名检查服务分开。因此,例如,您可以执行 auth.example.comapi.example.com 之类的操作,而 api.example.com 仅接受签名的内容,但不接受用户名和密码。一个额外的层对用户 ID 和签名都进行了加密,因此将更难复制它们并添加过期时间,因此更难重播请求。签署每个请求是最安全但最昂贵的方式。和ofc。你需要 SSL。

在您的大写中,没有用户 ID,因为它是注册。在这种情况下,只需将整个半填写的表格存储在客户端中。如果它没有 javascript 或某些服务器端语言,则可能在 cookie 中并将其与验证码一起发送回服务器。

另一种方法是在服务器上创建一个具有非常长的随机 id 的临时事务类型的资源,客户端可以知道资源的 id 并将事务 id 与验证码一起发回。此解决方案需要服务器资源,因此它有点类似于会话管理,但如果您难以将会话完全保留在客户端上并且当您需要最终一致性、多选项卡表单、多步骤流程等时,这是一个很好的折衷方案。大写我宁愿使用第一种方法,除非验证码进入一个完全不同的通信渠道,如 SMS、android 应用程序等,并且没有办法或者你不希望他们手动将其键入客户端,例如以验证他们需要单击通过 SMS 到达其智能手机的链接。

【讨论】:

    【解决方案2】:

    你可以使用 Laravel 缓存系统来代替会话。

    Cache::set('key','value');
    Cache::get('key'); // return 'value'
    

    【讨论】:

      【解决方案3】:

      首先,我不建议使用 Nullable Data 进行任何形式的验证。这来自您的验证上下文,我相信您应该使用'user_full_name' => 'required' ,因为您将使用它进行验证。

      其次,我不认为 Session 或任何替代方案是解决这种情况的好方法,我宁愿用 auth 中间件保护验证路由,Issue and return a Sanctum API Token

      $token = $request->user()->createToken($request->user_full_name);
      return response([
              'data' => 'verification code is sent',
              'token' => $token
              'status' => 200
          ]);
      

      然后,当用户输入代码时,我将使用作为授权标头的令牌检索用户,然后根据发送的代码检查代码以进行验证。 (我也会保留验证码)。

      【讨论】:

        【解决方案4】:
        public function register(Request $request)
            {
                // Validation Data
                $validData = $this->validate($request, [
                    'user_input' => 'required|regex:/^09\d{9}$/|max:11|min:11',
                    'user_full_name' => 'nullable|max:20|min:3',
                ]);
                
                //Session::put('user_full_name', $request->user_full_name);
                DB::raw('CREATE TEMPORARY TABLE api_temp_users(user_full_name VARCHAR(255));
                DB::table('tbl_temp_user')->insert(["user_full_name" => $request->user_full_name]);
                
                $sms = new SendSms(request()->all()['user_input'],43,request()->all());
                $sms->send();
                
                return response([
                    'data' => 'verification code is sent',
                    'status' => 200
                ]);
            }
        
         public function wipeTemporaryTable(Request $request) 
            {
            if($request->has('wipeData'))
              {
            $user_id = User::findOrFail($request->id);
            DB::table('api_temp_users')->where('id', $user_id )->delete();
        
            return response([
                    'data' => 'Temporary User Row successfully Deleted!',
                    'status' => 200
                ]);
             }
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-04
          • 2021-04-01
          • 2011-03-26
          • 1970-01-01
          • 2013-04-23
          • 2015-02-10
          • 1970-01-01
          • 2017-12-24
          相关资源
          最近更新 更多