Sign-in API with Multiple Auth Provider in ASP.NET Core from scratch – Part 2

Chuỗi bài viết hướng dẫn cấu hình server hỗ trợ identity api bằng nhiều phương pháp khác nhau như username, password hoặc identity với tài khoản Facebook, Google…

Sau khi thêm và cấu hình các thư viện IdentityServer4 (idsrv4) và AspNetCore.Identity bạn đã có một membership server và hỗ trợ cấp phát token nếu user đăng nhập thành công bằng cách gửi username & password qua token API

Cấu hình Sign-in API hỗ trợ Facebook và Google

Phần tiếp theo chúng ta sẽ cấu hình để API trên có thể hỗ trợ verify và cho đăng nhập user từ các dịch vụ Single Sign-on như Facebook, Google.

Như bài viết trước, trên ứng dụng cài đặt chức năng Single Sign-on. Khi người dùng đăng nhập thành công bạn sẽ nhận được một cái token. Token này dùng để định danh của social user của dịch vụ tương ứng là Facebook hoặc Google.

Vậy việc cần làm ở tầng id server của mình là:

  • Kiểm tra xem thông tin đăng nhập là dạng nào, dạng Password hay External Provider (Facebook, Google)
  • Nếu là external, verify provider token xem hợp lệ hay không và lấy thông tin social identity từ token đó
  • Kiểm tra xem có user trên hệ thống đã liên kết với tài khoản social trên hay chưa:
    • Nếu có rồi thì cho login thành công
    • Nếu chưa thì kiểm tra xem có user nào cùng email với tài khoản social không
      • Nếu có, liên kết user với tài khoản social và cho login thành công
      • Nếu chưa, tạo mới user trên hệ thống và liên kết tài khoản social sau đó cho user login thành công

Bước 1: Override lại tầng ResourceOwnerPasswordValidator của idsrv4

Trên project MiniBook.Identity hôm trước, tạo mới class CustomResourceOwnerPasswordValidator.cs (trong thư mục Data/Validation), class này sẽ kế thừa class IdentityServer4.AspNetIdentity.ResourceOwnerPasswordValidator, cụ thể như sau:

Set lại options và dependency của idsrv4 trong file Startup.cs bằng cách thêm vào phương thức ConfigureServices:

Ở đây mình có set lại đoạn InputLengthRestrictions.Password = int.MaxValue do lúc request mình dùng field password để chứa token của social user.

Bước 2: Thêm các class helper để verify và lấy thông tin của social user

Mình viết sẵn các phương thức lấy thông tin social user từ token của nó, mình lấy thông tin cơ bản như họ tên, email,… và quan trọng là field id, đây là định danh của social user dùng để liên kết với user trên hệ thống của bạn.

Bước 3: Hoàn thiện custom validator

Bước cuối cùng ta hoàn thiện class CustomResourceOwnerPasswordValidator.cs khi nãy.

Bằng cách override phương thức ValidateAsync. Thông qua tham số context ta có thể lấy được các thông tin trong request của client. Sau đó truy cập dữ liệu membership của hệ thống thông qua UserManager và SignInManager . Kết hợp với các class helper ở trên để hoàn tất thuật toán như mình đã liệt kê ở trên.

Cũng khá đơn giản nên mình không giải thích thêm, sau đây là code mẫu:

Bước 4: Test thử

Bạn có thể dùng tẩng client như đã hướng dẫn ở bài trước, hoặc vào trang
developers.facebook.com/tools/explorer để generate một cái access-token để test thử trước trên Postman

Request cũng là /connect/token với field username điền tên provider, password thì điền token của nó

Bạn có thể lấy accesstoken nhận được để lấy thông tin user trên hệ thống của bạn (qua url /connect/userinfo)

Nếu bạn kiểm tra database của mình, bạn sẽ thấy các thông tin này đã được lưu lại trên 3 table Users, UserClaims và UserLogins

Chúc bạn thành công.