Tạo hệ thống đăng nhập cho user với Facebook và Laravel Socialite

Bạn sẽ học được gì qua bài viết này?

Trong bài này bạn sẽ biết được cách tạo hệ thống đăng nhập để xác thực user bằng cách sử dụng 1 mạng xã hội (như Facebook, Twitter, Gmail …) với Socialite – 1 package của Laravel.

Cài đặt Socialite

Với các PHP Framework khác thì việc xây dựng hệ thống đăng nhập thông qua bên thứ 3 khá phức tạp và có ít tài liệu hướng dẫn, tuy nhiên đối với Laravel thì lại vô cùng dễ dàng. Hiện tại, Socialite hỗ trợ đăng nhập qua các mạng xã hội Facebook, Github, Google, Twitter và Bitbucket. Nếu bạn muốn sử dụng Socialite với các mạng xã hội khác (như Youtube, WordPress …) thì bạn có thể tham khảo Socialite Providers

Tuy đã được giới thiệu trong documentation của Laravel phiên bản 5.4 tuy nhiên Socialite mặc định vẫn chưa phải là core của Laravel. Do đó bạn cài đặt Socialite bằng composer

Hoặc bạn có thể thêm dòng bên dưới vào phần require của file composer.json rồi chạy lệnh composer update

Sau khi đã cài đặt Socialite bạn cấu hình lại file config/app.php => thêm dòng sau vào mảng providers

Tiếp tục bạn thêm 1 facade với tên Socialite vào mảng aliases

Ok, đến đây thì bạn đã có thể sẵn sàng sử dụng Socialite trong project Laravel của bạn rồi đấy!

Tạo Facebook app

Để có thể sử dụng Facebook như một hệ thống đăng nhập cho user thì bạn cần phải tạo 1 Facebook app. Đừng lo lắng, điều này cũng vô cùng dễ dàng! Đầu tiên bạn hãy đăng nhập vào account Facebook của bạn và truy cập vào https://developers.facebook.com

Phần Account Menu ở góc phải trên cùng bạn click vào Add a New App và chọn Website để tạo Facebook app

Điều vào tên app của bạn và bấm Create New Facebook App ID. Màn hình sẽ xuất hiện như bên dưới

Chọn category cho Facebook app của bạn rồi bấm Create App ID, sau đó bấm vào Skip Quick Start để vào phần Dashboard của app

Để có thể lấy được App Secret, bạn bấm vào nút Show rồi điền mật khẩu tài khoản Facebook của bạn.

Tạo Facebook test app

Nếu bạn đang muốn test chức năng Facebook login trên localhost, hãy bấm vào menu Test App tại phần Dashboard, điền vào đầy đủ thông tin rồi bấm Create Test App (như hình bên dưới)

Sau đó bạn vào Settings > Add Platforms > Website, điền vào domain website của bạn trên localhost vào 2 phần App DomainsSite URL, ví dụ cookbook.app (về việc set domain ảo trên localhost cho Apache bạn có thể tham khảo trên Internet)

Sau cùng hãy bấm vào Save Changes để lưu lại toàn bộ thay đổi. Và nhớ đừng quên 2 thông tin quan trọng nhất để bạn có thể sử dụng ở bước tiếp theo là App IDApp Secret

Cấu hình Facebook app trong Laravel project

Sau khi đã tạo xong 1 Facebook app, bạn có thể liên kết nó với Laravel bằng cách sửa file config/services.php

Hoặc bạn có thể sử dụng biến từ file .env

Lúc đó bạn có thể chỉnh lại file config/services.php như sau

Trong đó yourFacebookAppIDApp IDyourFacebookAppSecretApp Secrethttp://yourLaravelAppURL/login/facebook/callback là link trên website của bạn mà user sau khi đăng nhập Facebook app thành công sẽ được redirect tới.

Đến đây thì quá trình cài đặt và cấu hình Socialite cho Laravel đã hoàn tất! Bạn có thể tham khảo kỹ hơn documentation của Socialite trên Github tại đây https://github.com/laravel/socialite để hoàn tất hệ thống đăng nhập user của bạn.

Happy coding! 😀

Gửi email bằng Gmail và SendGrid trên Laravel 5

Laravel cung cấp cho chúng ta nhiều phương thức để gửi email. Bạn có thể sử dụng mail server trên host/vps/server của bạn để gửi mail, hoặc sử dụng các dịch vụ gửi mail bên ngoài như Mailgun, Sendgrid, Mandrill, Amazon SES, v.v…

Để gửi email trên Laravel, trước tiên hãy tùy chỉnh file config/mail.php

1/ Gửi email bằng Gmail

Đầu tiên bạn truy cập vào https://myaccount.google.com/security#connectedapps sau đó thiết lập tùy chỉnh tại Sign-in & security -> Connected apps & sites -> Allow less secure apps. Bạn chỉnh Allow less secure apps thành ON => điều này sẽ cho phép bạn sử dụng ứng dụng không phải của Google đăng nhập vào Gmail của bạn để gửi email.

Tiếp đến bạn cần chỉnh các thông số gửi mail tại file .env

Trong đó yourEmail là Gmail của bạn, và yourPassword là mật khẩu Gmail của bạn.

*** Nếu bạn gặp phải lỗi sau khi gửi mail “Failed to authenticate on SMTP server with username “youremail@gmail.com” using 3 possible authenticators” thì bạn hãy thử 1 trong các cách sau:

– Truy cập vào https://accounts.google.com/UnlockCaptcha và click vào continue and unlock your account for access through other media/sites
– Sử dụng mật khẩu với 2 dấu nháy kép “your password”
– Sử dụng Gmail username không có đuôi @gmail.com

2/ Gửi email bằng SendGrid

Đầu tiên bạn cần đăng ký 1 tài khoản tại https://sendgrid.com

Sau khi lấy được thông tin SMTP từ SendGrid, bạn tiến hành chỉnh sửa file .env

3/ Viết code để kiểm tra việc gửi email

Cuối cùng, bạn cần viết code gửi email để kiểm tra xem code của bạn đã hoạt động chính xác chưa. Để làm việc này, bạn thêm vào file routes.php đoạn sau

Như bạn thấy, chúng ta sử dụng method send của Mail facade với 3 tham số

– Tên của view mà chúng ta sẽ sử dụng để gửi mail
– Mảng $data để truyền biến vào view
– Closure function (hàm closure) để bạn tùy chỉnh các thông số như tiêu đề email, email gửi, email nhận …

Bạn cần tạo file views/emails/welcome.blade.php để Laravel sử dụng file này như nội dung của email

Sau cùng, bạn thử truy cập vào http://domain/sendemail để kiểm tra (trong đó domain là tên miền của bạn), nếu bạn thấy kết quả trả về trên trình duyệt là đoạn text “Gửi email thành công!!!” => điều đó nghĩa là bạn đã cấu hình email thành công, hoặc bạn có thể kiểm tra email được gửi đến để chắc chắn hơn.

Kết hợp WordPress và Laravel

WordPress là CMS nổi tiếng nhất thế giới hiện nay, và Laravel là 1 PHP Framework đang đứng hàng top với nhiều developer đang sử dụng, cho nên hẳn là sự kết hợp giữa 2 trường phái này rất là thú vị ???? Làm sao để 1 website đang sử dụng WordPress có thể sử dụng được core của Laravel hoặc ngược lại sẽ được đề cập đến trong bài viết này. Chúng ta sẽ cùng xem WordPress và Laravel “song kiếm hợp bích” như thế nào nhé? ????

1/ WordPress Corcel

– Corcel sử dụng Eloquent model của Laravel để tương tác với WordPress database. Một số ví dụ đơn giản sau đây tôi nghĩ sẽ chắc cũng rất dễ hiểu

– Corcel hỗ trợ hầu hết các khái niệm trong WordPress như posts, post types, taxonomies, pages, categories và attachments. Corcel vẫn còn đang trong quá trình tiếp tục phát triển, bạn có thể tham khảo tại link Github của dự án này

https://github.com/jgrossi/corcel

2/ WordPressToLaravel

– WordPressToLaravel giúp bạn đồng bộ dữ liệu từ blog wordpress.com. Nó chạy như 1 cron job thông qua Laravel Scheduler, tự động download và import dữ liệu vào database dưới máy của bạn. Chi tiết về cách sử dụng bạn có thể tham khảo ở link bên dưới

https://github.com/jasonherndon/WordpressToLaravel

3/ WP Eloquent

– WP Eloquent là 1 package giúp bạn tương tác dễ dàng với WordPress database. Package này bao gồm như model như Posts, Comments, Post Meta và User Meta. Sau khi cài đặt bạn có thể sử dụng nó 1 cách dễ dàng

– WP Eloquent có thẻ làm việc tốt với Laravel DebugBar và không tạo thêm bất kỳ kết nối phụ nào đến database.

4/ laravel-wp-api

– laravel-wp-api có thể tích hợp trực tiếp với WordPress JSON REST API cho những self-hosted website. Cách sử dụng cũng rất đơn giản

hoặc tham khảo thêm toàn bộ tại trang Github của dự án https://github.com/Cyber-Duck/laravel-wp-api

Một số phương thức khác kết hợp WordPress và Laravel

WordPlate
Sử dụng WordPress với Lumen
Cấu hình Laravel API với WordPress backend
Sử dụng Laravel 4 + Eloquent với WordPress

Cài đặt Laravel

Yêu cầu về môi trường code (hoặc server)

– Trước khi cài đặt Laravel, bạn cần đảm bảo môi trường code (trên localhost) hoặc trên hosting/vps/server của bạn đã thỏa mãn các yêu cầu sau:

+ Phiên bản PHP từ 5.5.9 trở lên
+ Extension OpenSSL, PDO, Mbstring,Tokenizer của PHP đã được cài đặt và đang hoạt động

Cài đặt Laravel

– Laravel sử dụng Composer để quản lý các gói package phụ thuộc, do đó trước khi cài Laravel bạn hãy tiến hành cài Composer trước. Bạn có thể tìm hiểu cách tài về và cài đặt Composer tại trang chủ của nó

a) Cài đặt thông qua Laravel Installer

– Đầu tiên bạn download Laravel Installer thông qua Composer

– Hãy chắc rằng đường dẫn đến thư mục ~/.composer/vendor/bin (tương ứng trên mỗi hệ điều hành có thể khác nhau) đã nằm trong đường dẫn PATH để câu lệnh laravel có thể được thực thi. Sau khi cài đặt xong, bạn có thể tạo ứng dụng web mới bằng Laravel thông qua câu lệnh sau (blog là tên ứng dụng web của bạn)

b) Cài đặt thông qua Composer Create-project

– Ngoài cách trên bạn có thể sử dụng dòng lệnh create-project của composer

Cấu hình Laravel

– Tất cả những file cấu hình của Laravel được lưu trong thư mục config trong ứng dụng web của bạn

a) Quyền truy cập vào các directory (đường dẫn)

– Sau khi cài đặt Laravel, bạn cần đảm bảo rằng các đường dẫn storagebootstrap/cache đã được cấp quyền cho phép ghi (write) trên môi trường code hoặc trên hosting/vps/server của bạn, nếu không thì Laravel sẽ không chạy được.

b) Mã key của ứng dụng (application key)

– Điều cần làm tiếp theo quan trọng không kém đó là bạn phải thiết lập 1 chuỗi key ngẫu nhiên cho ứng dụng web của bạn. Nếu bạn đã cài đặt Laravel thông qua Composer hoặc Laravel Installer, mã key này sẽ được set thông qua dòng lệnh

– Thông thường chuỗi key này sẽ dài 32 ký tự. Key này được lưu tại file .env (viết tắt của environment file). Nếu bạn chưa đổi tên file .env.example thành .env thì bạn nên làm ngay. Nếu mã key của ứng dụng không được thiết lập, thì sessions và những dữ liệu được mã hóa sẽ không được bảo mật tốt.

c) Những cấu hình khác

– Bạn có thể cấu hình các thông số khác tại file config/app.php. Một số tùy chọn như timezone (múi giờ), locale bạn có thể điều chỉnh lại cho phù hợp. Ngoài ra bạn có thể cấu hình một số thành phần của Laravel như:

+ Cache
+ Database
+ Session

Middleware trong Laravel

Giới thiệu

Middleware cung cấp một giải pháp khá tiện ích cho việc filtering HTTP các requests vào ứng dụng. Ví dụ, Laravel có chứa một middleware xác thực người dùng đăng nhập vào hệ thống. Nếu user chưa đăng nhập, middleware sẽ chuyển hướng user tới màn hình đăng nhập. Tuy nhiên, nếu user đã đăng nhập rồi, thì middleware sẽ cho phép request được thực hiện tiếp tiến trình xử lý vào ứng dụng.

Tất nhiên, bạn có thể viết thêm middleware để thực hiện nhiều tác vụ nữa ngoài kiểm tra đăng nhập vào hệ thống. Một CORS middleware có trách nhiệm cho việc thêm các header hợp lý vào trong tất cả các response gửi ra ngoài. Một logging middleware có thể ghi log cho tất cả các request tới ứng dụng.

Có vài middleware đã có sẵn trong Laravel framework, bao gồm middlware xác thực, CSRF protection. Tất cả được nằm trong thư mục app/Http/Middleware.

Tạo Middleware

Để tạo mới một middleware, sử dụng lệnh make:middleware:

Câu lệnh này sẽ tạo ra class CheckAge bên trong thư mục app/Http/Middleware. Trong middleware này, chúng ta chỉ cho phép truy cập vào route nếu giá trị age lớn hơn 200. Ngược lại, chúng ta sẽ chuyển hướng request lại trang home URI.

Như bạn thấy, nếu biến age nhỏ hơn hoặc bằng 200, middleware sẽ trả về một HTTP tới client; ngược lại, request sẽ được gửi tiếp để xử lý. Để truyền request vào sâu hơn trong ứng dụng (cho phép middleware “vượt qua”), đơn giản chỉ cần gọi callback $next với $request.

Tốt nhất hãy hình dung như là một chuỗi các “lớp” trên HTTP requests cần phải đi qua trước khi nó vào ứng dụng. Mỗi lớp sẽ được kiểm tra request và thậm chí có thể hủy từ chối request hoàn toàn.

Trước & Sau Middleware

Việc middleware chạy trước hay chạy sau một request phụ thuộc vào chính nó. Ví dụ, middleware dưới đây sẽ làm một vào tác vụ trước khi request được chương trình xử lý:

Tất nhiên, middleware này sẽ thực hiện việc của nó sau khi request được xử lý bởi ứng dụng:

Đăng ký Middleware

Global Middleware

Nếu bạn muốn một middleware có thể thực thi trong mọi HTTP request tới ứng dụng của bạn, đơn giản chỉ cần thêm tên class của middleware trong thuộc tính $middleware của class app/Http/Kernel.php.

Gán Middleware vào Routes

Nếu bạn muốn gán middleware cho route cụ thể, đầu tiên bạn cần thêm middleware đấy vào trong file app/Http/Kernel.php. Mặc định, thuộc tính $routeMiddleware sẽ chứa một số class thuộc middleware của framework Laravel. Để thêm middleware của bạn, đơn giản chỉ là thêm nó vào dach sách và gán từ khóa bạn chọn. Ví dụ:

Khi middleware đã được định nghĩa trong HTTP kernel, bạn có thể sử dụng phương thức middleware gán cho một route:

Ngoài ra bạn cũng có thể gán nhiều middleware cho một route:

Khi đã gán middleware, bạn cũng có thể sử dụng tên đầy đủ của middleware:

Nhóm Middleware

Thỉnh thoảng bạn muốn nhóm một vài middleware lại trong một khóa để thực hiện gán vào route dễ dàng hơn. Bạn có thể sử dụng thuộc tính $middlewareGroups của HTTP kernel.

Mặc định, Laravel cung cấp sắp 2 nhóm middleware web và api chứa những middleware thường sử dụng mà bạn có thể muốn áp dụng cho web UI và API routes:

Nhóm middleware được gán vào routes và controller sử dụng cú pháp tương tự như với từng middleware. Một lần nữa, nhóm middleware làm đơn giản trong việc gán các middleware vào trong một route:

Tham số middleware

Middleware cũng có thể nhận thêm các tham số truyền vào. Ví dụ, nếu ứng dụng của bạn cần xác thực có “role” cụ thể trước khi thực hiện một thao tác nào đó, bạn có thể tạo một CheckRole middleware để nhận tên của role như một tham số.

Thêm các tham số middleware sẽ dược truyền vào middleware ngay sau tham số $next của hàm handle:

Tham số middleware có thể được khai báo trên route bằng cách phân chia tên middleware và tham số bởi dấu :. nhiều thao số thì phân chia bởi dấy phẩy:

Terminable Middleware

Thỉnh thoảng một middleware có thể cần thực hiện sau khi HTTP response đã được gửi xong cho trình duyệt. Ví dụ, “session” middleware đi kèm với Laravel cung cấp dữ liệu session cho storage sau khi response được gửi tới trình duyệt. Nếu bạn định nghĩa một terminate vào trong middleware, nó sẽ tự động được gọi sau khi response được gửi tới trình duyệt.

Hàm terminate sẽ nhận cả request và response. Khi bạn đã định nghĩa terminable middleware, bạ phải thêm nó vào trong danh sách global middleware trong HTTP kernel.

Khi gọi hàm terminate trong middleware, Laravel sẽ thực hiện giải quyết trường hợp mới cho middleware từ service container. Nếu bạn muốn sử dụng cùng một trường hợp khi mà hàm handle và hàm terminate được gọi, đăng ký middleware vào trong container sử dụng hàm singleton.

Nguồn: https://laravel.com/docs/5.2/middleware