Yêu cầu thg 10 2, 2021 9:20 SA 219 2 1
  • 219 2 1
+1

Convert dữ liệu login từ md5 sang laravel hash

Chia sẻ
  • 219 2 1

mọi người cho mình hỏi, trước đây mình tạo 1 website với vài trăm người dùng nhưng là code php thuần, phần login lúc mã hoá mật khẩu khách mình sử dụng md5 để mã hoá.

bây giờ mình chuyển sang dùng laravel thì nó hash password theo cách khác khi dùng jwt, vậy có cách nào để chuyển pass từ csdl cũ sang laravel không ạ ?

phương án mình định dùng là đề tồn tại cả 2 loại pass, khi khách cũ login thì sẽ tự động tạo luôn pass mới theo cách hash của laravel, khách mới đăng ký thì sẽ chỉ tạo pass mới theo cách hash của laravel. Nhưng mình cảm thấy cách này không được tối ưu cho lắm. Vậy cho mình hỏi có giải pháp thay thế không ạ ?

Hoặc nếu có thể dùng luôn pass cũ thì càng tốt ạ, như ngày xưa mình lưu trong session ấy, vì mình dùng vuejs và mình cũng chỉ mới học vue và laravel nên còn khá chuối phần này.

Xin cảm ơn.

1 CÂU TRẢ LỜI


Đã trả lời thg 10 2, 2021 1:05 CH
Đã được chấp nhận
+2

chào mọi người, sau khi tìm hiểu khắp các diễn đàn laravel, github, stackoverflow và chắp vá chỉnh sửa thì mình đã giải quyết được vấn đề. Nhân đây mình post luôn kết quả của mình cho mọi người cũng tham khảo nếu gặp phải vấn đề giống mình

public function login(Request $request)
    {
        //validate incoming request
        $this->validate($request, [
            'email' => 'required|string',
            'password' => 'required|string',
        ]);
        $user = User::where('username', '=', $request->email)->first(); 
        if (isset($user)) { //check nếu tồn tại username do hệ thống cũ của mình không bắt buộc email
            if ($user->password == md5(md5($request->password))) { // nếu vẫn còn là pass bằng md5+md5
                $user->password = app('hash')->make($request->password); // chuyển luôn sang dạng mới
                $user->save(); //lưu lại
                $login_type = filter_var($request->email, FILTER_VALIDATE_EMAIL) ? 'email' : 'username'; //kiểm tra xem là vừa nhập vào là username hay email
                $credentials = [$login_type => $request->email, 'password' => $request->password];

                try {
                    if (!$token = Auth::attempt($credentials)) {
                        return response()->json(['message' => 'Đăng nhập thất bại1']);
                    }
                    return  response()->json(['token' => $token, 'message' => 'Đăng nhập thành công1', 'user' => $user]);
                } catch (\Exception $e) {

                    return response()->json(['message' => 'Đăng nhập thất bạic']);
                }
            } else { //nếu tồn tại user nhưng pass không đúng có thể là khách nhập sai pass hoặc pass đã chuyển sang loại mới
                $login_type = filter_var($request->email, FILTER_VALIDATE_EMAIL) ? 'email' : 'username'; //lại check username or email
                $credentials = [$login_type => $request->email, 'password' => $request->password];
                if (!$token = Auth::attempt($credentials)) {
                    return response()->json(['message' => 'Đăng nhập thất bại2']);
                }                
                $user = Auth::user();

                return  response()->json(['token' => $token, 'message' => 'Đăng nhập thành công2', 'user' => $user]);
            }


            $user = Auth::user();
        } else { //dùng cho khách tạo mới sẽ dùng cái này do code của mình chuyển sang dùng email thay cho username luôn
            $credentials = $request->only(['email', 'password']);

            if (!$token = Auth::attempt($credentials)) {
                return response()->json(['message' => 'Đăng nhập thất bại']);
            }
            
            $user = Auth::user();

            return  response()->json(['token' => $token, 'message' => 'Đăng nhập thành công3', 'user' => $user]);
        }
    } 

do code mình vừa viết vừa test nên hơi ngáo :v

Chia sẻ
thg 10 3, 2021 5:12 SA
  • md5 sẽ có 32 kí tự [0-9a-zA-Z].
  • Còn dùng passwod hash của các framework giờ hầu hết dùng bcrypt hoặc cái gì đó đại loại thế có độ dài và format khác luôn (thường bao gồm cả kí tự $/.)

phía code trên của bạn thì chỉ cần check độ dài password = 32 rồi cho vào kiểm tra luôn cho nhanh

function login(Request $request) {
    //validate incoming request
    $this->validate($request, [
        'email' => 'required|string',
        'password' => 'required|string',
    ]);
    $user = User::where('username', '=', $request->email)->first(); 
    if (empty(user)) {
        return response()->json(['message' => 'Đăng nhập thất bại']);
    }
    $credentials = $request->only(['email', 'password']);
    if (strlen($user->password) === 32) {
        if ($user->password !== md5(md5($request->password))) {
            return response()->json(['message' => 'Đăng nhập thất bạic']);
        } // nếu vẫn còn là pass bằng md5+md5
        $user->password = app('hash')->make($request->password); // chuyển luôn sang dạng mới
        $user->save(); //lưu lại
        $login_type = filter_var($request->email, FILTER_VALIDATE_EMAIL) ? 'email' : 'username'; //kiểm tra xem là vừa nhập vào là username hay email
        $credentials = [$login_type => $request->email, 'password' => $request->password];
    }

    if (!$token = Auth::attempt($credentials)) {
        return response()->json(['message' => 'Đăng nhập thất bại']);
    }
    
    $user = Auth::user();

    return  response()->json(['token' => $token, 'message' => 'Đăng nhập thành công3', 'user' => $user]);
}

Ví dụ bcrypt format: https://viblo.asia/p/co-ban-ve-ma-hoa-mat-khau-3Q75wQNJZWb

Avatar Naht @Naht
thg 10 4, 2021 1:07 SA

@kdg tks nhiều

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí