服务端实现登陆验证传统方法与jwt方法对比

服务端实现登陆验证传统方法与jwt方法对比

总结

  • 传统方法使用了cookie和session这两个技术,cookie是存储在客户端的,session是存储在服务端的。这种方法需要客户端与服务端两者的参与,耦合度相对来说高。
  • jwt在客户端使用了cookie技术, 在服务端只对客户端发来的token进行解析,省去了session的使用,相对来说耦合度低。

传统方法思路

用户授权往往还是采用Cookie+Session的方式,也就是需要原生应用中模拟浏览器对Cookie的操作。

jwt思路

在使用过程中,服务端通过用户登录验证之后,将Header+Claim信息加密后得到第三段签名,然后将签名返回给客户端,在后续请求中,服务端只需要对用户请求中包含的JWT进行解码,即可验证是否可以授权用户获取相应信息

A browser or mobile client makes a request to the authentication server containing user login information. The authentication server generates a new JWT access token and returns it to the client. On every request to a restricted resource, the client sends the access token in the query string or Authorization header. The server then validates the token and, if it’s valid, returns the secure resource to the client.

对比

使用JWT可以省去服务端读取Session的步骤,这样更符合RESTful的规范。但是对于客户端(或App端)来说,为了保存用户授权信息,仍然需要通过Cookie或类似的机制进行本地保存。因此JWT是用来取代服务端的Session而非客户端Cookie的方案

laravel jwt具体实现

在UserController的构造器中调用middleware,判断http头文件的token信息。这个token信息是客户端发过来的。

public function __construct(UserRepository $userRepo)
    {
        $this->middleware('jwt.auth');
        $this->userRepo = $userRepo;
    }

register的实现

思路:判断用户的手机号码是否被注册后再增加一个user,使用fromUser方法生成token后返回给客户端。

public function register($payload){
        if($this->isRegistered($payload['phone'])){
            return array('result' => false, 'reason' => 'the account was registered');
        }

        DB::beginTransaction();
        try {
            $payload['UserID'] = $this->createUser($payload);
            DB::commit();

            $user = User::where('UserID', $payload['UserID'])->first();
            $token = JWTAuth::fromUser($userAgent);
            return array('result' => true, 'token' => $token);
        } catch (Exception $e) {
            DB::rollback();
            dd($e->getMessage());
            return array('result' => false);
        }
    }

login的实现

思路:从payload中拿到账号和密码后使用attempt方法拿到token,attemp方法实际上是拿数据与数据库中的数据进行对比,这里laravel有个坑,传进去的密码的键必须是’password’。

public function login($payload){
        $credentials = $this->getCredentials($payload);
        try {
            if (! $token = JWTAuth::attempt($credentials)) {
                return array('result' => false, 'reason' => 'invalid token');
            }
        } catch (JWTException $e) {
            return array('result' => false, 'reason' => 'unexpected error');
        }

        return array('result' => true, 'token' => $token);
    }

拿到登陆用户

public function me(){
        $userAgent = JWTAuth::parseToken()->authenticate();
        $user_profile = $this->userRepo->getUserProfile($userAgent);
        return response()->json($user_profile, 200);
    }

参考资料

稿源:燃冰非冰 (源链) | 关于 | 阅读提示

本站遵循[CC BY-NC-SA 4.0]。如您有版权、意见投诉等问题,请通过eMail联系我们处理。
酷辣虫 » 综合编程 » 服务端实现登陆验证传统方法与jwt方法对比

喜欢 (0)or分享给?

专业 x 专注 x 聚合 x 分享 CC BY-NC-SA 4.0

使用声明 | 英豪名录