Bối cảnh
Khi tạo các dịch vụ hoặc ứng dụng web, người ta thường sử dụng cái được gọi là IDaaS (ID dưới dạng Dịch vụ: SaaS cho các chức năng quản lý người dùng). Tôi thường sử dụng Auth0 và AppID. Không chỉ đối với đăng nhập/đăng xuất của người dùng, mà còn đối với các chức năng đăng ký trực tuyến rắc rối, chúng được cung cấp dưới dạng API và thường được giao cho họ quản lý người dùng. Đặc biệt khi sử dụng Auth0 với Node.js, có một thư viện chuyên dụng và bằng cách sử dụng thư viện này, tôi có thể dễ dàng tạo một dịch vụ được liên kết.
Gần đây tôi nhận thấy rằng tôi không thể đăng xuất đúng cách khi đang phát triển dịch vụ bằng Auth0. Trước đây tôi có thể đăng xuất bằng đoạn mã sau, nhưng mặc dù không có lỗi nào được tạo ra, tôi không chắc đó là phiên hay cookie nhưng thông tin vẫn còn và tôi không thể đăng xuất (với đoạn mã sau, thông tin đăng nhập vẫn còn và nó chuyển sang trang đầu).
1 2 3 4 5 6 | app <span class="token punctuation">.</span> <span class="token function">get</span> <span class="token punctuation">(</span> <span class="token string">'/auth0/logout'</span> <span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> <span class="token parameter">req <span class="token punctuation">,</span> res</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> req <span class="token punctuation">.</span> <span class="token function">logout</span> <span class="token punctuation">(</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// Log out</span> res <span class="token punctuation">.</span> <span class="token function">redirect</span> <span class="token punctuation">(</span> <span class="token string">'/'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token comment">// After logging out, move to the top page ('/')</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
Ồ, tôi nghĩ mã này đã từng hoạt động trước đây… nên tôi đã xem xét kỹ hơn và có vẻ như quá trình đăng xuất đã thay đổi vào tháng 12 năm 2021. Hướng dẫn chuyển hướng đăng xuất
Tính đến điều này, tôi đã nghiên cứu phương pháp thực hiện đăng xuất Auth0 hiện tại, vì vậy tôi đã liệt kê nó bên dưới.
Chuẩn bị thực hiện đăng xuất
Trước tiên, bạn cần đăng ký trước URL của nơi bạn muốn đến sau khi đăng xuất như một bước chuẩn bị khi đăng xuất bằng Auth0. Đây là mục “Allowed Logout URLs” trong menu Ứng dụng sau khi đăng nhập vào Auth0, tại đây bạn chọn ứng dụng tương ứng:
Bạn cần đăng ký trước URL mà bạn sẽ được chuyển hướng đến sau khi đăng xuất, giống như URL gọi lại. Trong trường hợp của tôi, tôi đã sử dụng máy chủ cục bộ trong quá trình phát triển, vì vậy tôi đã chỉ định nó như sau, kết hợp nó với URL để sản xuất ( https://xxxxx.xxxxxxx.com ):
1 2 | http://localhost:8080,https://xxxxx.xxxxxxx.com |
Bây giờ chúng tôi đã hoàn thành tất cả các bước chuẩn bị cần thiết để thực hiện quá trình đăng xuất.
Triển khai tính năng đăng xuất
Chúng tôi đã xác nhận thông số kỹ thuật đăng xuất hiện tại như sau. Tóm lại, có vẻ như ứng dụng khách (trình duyệt) có thể đăng xuất chính xác bằng cách thực hiện yêu cầu GET tới https://(Auth0 domain)/v2/logout
với các tham số cần thiết được đính kèm :
Trên chương trình phía máy chủ, nó sẽ như thế này:
1 2 3 4 5 6 7 | app <span class="token punctuation">.</span> <span class="token function">get</span> <span class="token punctuation">(</span> <span class="token string">'/auth0/logout'</span> <span class="token punctuation">,</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> <span class="token parameter">req <span class="token punctuation">,</span> res</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> req <span class="token punctuation">.</span> <span class="token function">logout</span> <span class="token punctuation">(</span> <span class="token keyword">function</span> <span class="token punctuation">(</span> <span class="token punctuation">)</span> <span class="token punctuation">{</span> <span class="token comment">// Log out</span> <span class="token comment">//res.redirect( '/' ); // After logging out, move to the top page ('/')</span> res <span class="token punctuation">.</span> <span class="token function">redirect</span> <span class="token punctuation">(</span> <span class="token string">'https://(Auth0 domain)/v2/logout?client_id=(Auth0 client_id)&returnTo=http://localhost:8080'</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> <span class="token punctuation">}</span> <span class="token punctuation">)</span> <span class="token punctuation">;</span> |
Trong số này, tên miền Auth0 và ID ứng dụng khách Auth0 có thể được xác nhận/lấy cùng lúc khi đăng ký ứng dụng. Ngoài ra, quá trình đăng xuất sẽ được thực hiện mà không có tham số returnTo, nhưng quá trình sẽ kết thúc như hiện tại, do đó, tham số returnTo về cơ bản là bắt buộc. Tham số này chỉ định URL để chuyển đổi sau khi đăng xuất. URL này phải được bao gồm trong các URL đăng xuất được phép được chỉ định tại thời điểm chuẩn bị (lỗi nếu không được bao gồm trong các URL đăng xuất được phép được chỉ định trước đó).
Chúng tôi đã xác nhận rằng thay đổi này sẽ cho phép chúng tôi đăng xuất chính xác. phù…