ลิงก์วิเศษ (Magic link) (โทเค็นใช้ครั้งเดียว; One-time token)
คล้ายกับรหัสผ่านใช้ครั้งเดียว (OTP), โทเค็นใช้ครั้งเดียวเป็นอีกหนึ่งวิธีการยืนยันตัวตนแบบไม่ใช้รหัสผ่านที่สามารถใช้ตรวจสอบตัวตนของผู้ใช้ได้ โทเค็นนี้จะมีอายุการใช้งานจำกัด และเชื่อมโยงกับที่อยู่อีเมลของผู้ใช้ปลายทาง
บางครั้งคุณอาจต้องการเชิญผู้ใช้ใหม่เข้าสู่แอปพลิเคชัน / องค์กรของคุณโดยไม่ต้องให้พวกเขาสร้างบัญชีก่อน ในกรณีนี้ แอปพลิเคชันสามารถส่ง "ลิงก์วิเศษ" ไปยังอีเมลของคุณ และคุณจะได้รับการยืนยันตัวตนทันทีเมื่อคลิกลิงก์นั้น
นักพัฒนาแอปพลิเคชันสามารถใช้โทเค็นใช้ครั้งเดียวเพื่อสร้างลิงก์วิเศษ และส่งไปยังอีเมลของผู้ใช้ปลายทาง
กรณีการใช้งาน
Logto รองรับสถานการณ์ต่อไปนี้ด้วยลิงก์วิเศษ:
- การลงทะเบียนแบบเชิญเท่านั้น: สำหรับเครื่องมือภายในหรือผลิตภัณฑ์ AI ที่อยู่ในช่วงทดสอบ คุณสามารถปิดการลงทะเบียนสาธารณะและเชิญผู้ใช้เฉพาะผ่านลิงก์วิเศษ
- เชิญสมาชิกองค์กร: สำหรับผลิตภัณฑ์ SaaS ใช้ลิงก์วิเศษเพื่อเชิญสมาชิกใหม่เข้าร่วมองค์กร ช่วยให้กระบวนการ onboarding ราบรื่นขึ้น
- ลงชื่อเข้าใช้ / ลงทะเบียน: ส่งลิงก์วิเศษสำหรับการลงชื่อเข้าใช้หรือสมัครสมาชิกแบบไม่ใช้รหัสผ่านผ่านอีเมล
- รีเซ็ตรหัสผ่าน: ส่งลิงก์วิเศษสำหรับรีเซ็ตรหัสผ่านจากแอปของคุณเอง เพื่อให้ผู้ใช้ตรวจสอบโทเค็นใช้ครั้งเดียวและตั้งรหัสผ่านใหม่ใน Logto
ตัวอย่างเช่น เมื่อคุณปิดการลงทะเบียนสาธารณะ คุณสามารถส่งลิงก์วิเศษพร้อมโทเค็นใช้ครั้งเดียว (เช่น https://yourapp.com/landing-page?token=YHwbXSXxQfL02IoxFqr1hGvkB13uTqcd&email=user@example.com) ไปยังอีเมลของผู้ใช้เพื่อเชิญให้พวกเขาสร้างบัญชีให้เสร็จสมบูรณ์ คุณสามารถปรับแต่งเทมเพลตอีเมลในบริการส่งอีเมลของคุณเอง เช่น:
ปัจจุบันยังไม่รองรับ:
- การใช้หมายเลขโทรศัพท์หรือชื่อผู้ใช้เป็นตัวระบุ
โฟลว์โทเค็นใช้ครั้งเดียว
นี่คือไดอะแกรมลำดับของโฟลว์การยืนยันตัวตนด้วยโทเค็นใช้ครั้งเดียว:
คู่มือการใช้งาน
Logto มีชุด Management API และ Experience API เพื่อช่วยให้คุณใช้งานลิงก์วิเศษได้ง่ายขึ้น
ก่อนเริ่มต้น ให้แน่ใจว่าคุณมี Logto instance พร้อมใช้งาน และได้เชื่อมต่อ Machine-to-Machine ระหว่างเซิร์ฟเวอร์แอปของคุณกับ Logto endpoint (จำเป็นสำหรับ Management API) ดูเพิ่มเติมเกี่ยวกับ Logto Management API
ขั้นตอนที่ 1: ขอรับโทเค็นใช้ครั้งเดียว
ใช้ Logto Management API เพื่อสร้างโทเค็นใช้ครั้งเดียว
POST /api/one-time-tokens
ตัวอย่าง payload ของ request body:
{
"email": "user@example.com",
// ไม่บังคับ ค่าเริ่มต้นคือ 600 (10 นาที)
"expiresIn": 3600,
// ไม่บังคับ ผู้ใช้จะถูกจัดเตรียมเข้าองค์กรที่ระบุเมื่อยืนยันตัวตนสำเร็จ
"context": {
"jitOrganizationIds": ["abcdefgh1234"]
}
}
สำหรับลิงก์วิเศษรีเซ็ตรหัสผ่าน ให้จำกัดโทเค็นสำหรับโฟลว์ลืมรหัสผ่าน:
{
"email": "user@example.com",
"expiresIn": 3600,
"context": {
"interactionEvent": "ForgotPassword"
}
}
ขั้นตอนที่ 2: สร้างลิงก์วิเศษของคุณ
หลังจากได้รับโทเค็นใช้ครั้งเดียวแล้ว คุณสามารถสร้างลิงก์วิเศษและส่งไปยังอีเมลของผู้ใช้ปลายทาง
สำหรับลิงก์วิเศษลงชื่อเข้าใช้หรือสมัครสมาชิก ลิงก์ควรมีอย่างน้อย token และอีเมลของผู้ใช้เป็นพารามิเตอร์
สำหรับลิงก์วิเศษรีเซ็ตรหัสผ่าน พารามิเตอร์อีเมลเป็นทางเลือก; หากไม่ใส่ Logto จะขอให้ผู้ใช้กรอกอีเมลก่อนตรวจสอบโทเค็น
ลิงก์วิเศษควรนำไปยัง landing page ในแอปของคุณเอง
เช่น https://yourapp.com/landing-page
ตัวอย่างลิงก์วิเศษที่อาจมีหน้าตาดังนี้:
https://yourapp.com/landing-page?token=YHwbXSXxQfL02IoxFqr1hGvkB13uTqcd&email=user@example.com
ชื่อพารามิเตอร์ในลิงก์วิเศษสามารถปรับแต่งได้อย่างเต็มที่ คุณสามารถเพิ่มข้อมูลเพิ่มเติมลงในลิงก์วิเศษตามความต้องการของแอปพลิเคชันของคุณ รวมถึงการเข้ารหัสพารามิเตอร์ URL ทั้งหมด
ขั้นตอนที่ 3: เริ่มโฟลว์การยืนยันตัวตนผ่าน Logto SDK
ลงชื่อเข้าใช้หรือสมัครสมาชิก
หลังจากผู้ใช้ปลายทางคลิกลิงก์วิเศษและเข้าสู่แอปของคุณแล้ว คุณสามารถดึง token และ email จาก URL และเรียกใช้ฟังก์ชัน signIn() จาก Logto SDK เพื่อเริ่มโฟลว์การยืนยันตัวตน
// ตัวอย่าง React
import { useLogto } from '@logto/react';
import { useEffect } from 'react';
import { useSearchParams } from 'react-router-dom';
const TokenLandingPage = () => {
const { signIn } = useLogto();
const [searchParams] = useSearchParams();
useEffect(() => {
// ดึง token และ email จากลิงก์วิเศษ
const oneTimeToken = searchParams.get('token');
const email = searchParams.get('email');
// สมมติว่านี่คือ redirect URI สำหรับ sign-in ของคุณ
const redirectUri = 'https://yourapp.com/callback';
if (oneTimeToken && email) {
signIn({
redirectUri,
clearTokens: false, // ไม่บังคับ ดูคำเตือนด้านล่าง
extraParams: {
'one_time_token': oneTimeToken,
'login_hint': email,
},
});
}
}, [searchParams, signIn]);
return <>กรุณารอสักครู่...</>;
};
รีเซ็ตรหัสผ่าน
สำหรับลิงก์วิเศษรีเซ็ตรหัสผ่าน ให้เริ่มคำขอยืนยันตัวตนโดยตั้งค่า first_screen เป็น reset_password
ส่งผ่านโทเค็นใช้ครั้งเดียวผ่าน one_time_token
หากคุณมีอีเมลของผู้ใช้จาก landing page แล้ว ให้ส่งผ่าน login_hint ด้วย; หากไม่มีก็ไม่ต้องใส่ Logto จะขอให้ผู้ใช้กรอกอีเมลก่อนตรวจสอบโทเค็น
// ตัวอย่าง React
import { useLogto } from '@logto/react';
import { useEffect } from 'react';
import { useSearchParams } from 'react-router-dom';
const ResetPasswordTokenLandingPage = () => {
const { signIn } = useLogto();
const [searchParams] = useSearchParams();
useEffect(() => {
const oneTimeToken = searchParams.get('token');
const email = searchParams.get('email');
if (oneTimeToken) {
signIn({
redirectUri: 'https://yourapp.com/callback',
extraParams: {
'one_time_token': oneTimeToken,
'first_screen': 'reset_password',
...(email && { 'login_hint': email }),
},
});
}
}, [searchParams, signIn]);
return <>กรุณารอสักครู่...</>;
};
หากผู้ใช้ลงชื่อเข้าใช้แล้ว การเรียกใช้ฟังก์ชัน signIn() จาก SDK จะล้างโทเค็นที่แคชไว้ทั้งหมด (โทเค็น ID, โทเค็นการเข้าถึง, และโทเค็นรีเฟรช) ออกจาก storage ฝั่ง client
ซึ่งจะทำให้สถานะการยืนยันตัวตนของผู้ใช้ปัจจุบันหายไป
ดังนั้น คุณควรกำหนดพารามิเตอร์ clearTokens: false เพิ่มเติมเพื่อป้องกันการลบโทเค็นที่มีอยู่
หากกำหนดค่านี้ คุณจะต้องลบโทเค็นด้วยตนเองในหน้าคอลแบ็กของ sign-in
ข้ามข้อนี้ได้หากลิงก์วิเศษของคุณไม่ได้ออกแบบมาสำหรับผู้ใช้ที่ลงชื่อเข้าใช้แล้ว
ขั้นตอนที่ 4: (ไม่บังคับ) ลบโทเค็นที่แคชไว้ในหน้าคอลแบ็กของ sign-in
หากคุณกำหนด clearTokens: false ในฟังก์ชัน sign-in คุณต้องลบโทเค็นด้วยตนเองในหน้าคอลแบ็กของ sign-in
// ตัวอย่าง React
import { useHandleSignInCallback, useLogto } from '@logto/react';
import { useEffect } from 'react';
const Callback = () => {
const { clearAllTokens } = useLogto();
useEffect(() => {
void clearAllTokens();
}, [clearAllTokens]);
useHandleSignInCallback(() => {
// นำทางไปยังหน้าแรกของคุณ
});
return <>กรุณารอสักครู่...</>;
};
คำถามที่พบบ่อย
ฉันสามารถใช้ลิงก์วิเศษเพื่อเชิญผู้ใช้ใหม่เข้าสู่องค์กรของฉันได้หรือไม่?
ได้ คุณสามารถใช้ลิงก์วิเศษเพื่อเชิญผู้ใช้ใหม่เข้าสู่แอปพลิเคชันของคุณ รวมถึงองค์กรด้วย
หากต้องการเชิญผู้ใช้ใหม่เข้าสู่องค์กร เพียงระบุ jitOrganizationIds ใน request body
ผู้ใช้จะเข้าร่วมองค์กรโดยอัตโนมัติเมื่อยืนยันตัวตนสำเร็จ และจะได้รับบทบาทเริ่มต้นขององค์กร ดูหัวข้อ "Just-in-time provisioning" ในหน้ารายละเอียดองค์กรของคุณ และกำหนดบทบาทเริ่มต้นสำหรับองค์กรของคุณ
ฉันสามารถกำหนดบทบาทให้ผู้ใช้ผ่านลิงก์วิเศษได้หรือไม่?
โฟลว์การยืนยันตัวตนด้วยลิงก์วิเศษไม่รองรับการกำหนดบทบาทให้ผู้ใช้โดยตรง แต่คุณสามารถใช้ Webhooks และ Management API เพื่ออัปเดตบทบาทของผู้ใช้หลังจากลงทะเบียนได้เสมอ
โทเค็นใช้ครั้งเดียวหมดอายุหรือไม่?
ใช่ โทเค็นใช้ครั้งเดียวจะหมดอายุหลังจากเวลาที่กำหนดใน expiresIn (หน่วยเป็นวินาที) โดยค่าเริ่มต้นคือ 10 นาที
หากฉันปิดการลงทะเบียนผู้ใช้ใน "Sign-up and sign-in" ฉันยังสามารถใช้ลิงก์วิเศษเชิญผู้ใช้ได้หรือไม่?
ได้ คุณยังสามารถใช้ลิงก์วิเศษเชิญผู้ใช้ได้ แม้ว่าจะปิดการลงทะเบียนผู้ใช้ใน "Sign-up and sign-in" แล้วก็ตาม
จะเกิดอะไรขึ้นหากผู้ใช้ลงชื่อเข้าใช้แล้ว แล้วคลิกอีกลิงก์วิเศษหนึ่ง?
มีหลายสถานการณ์ที่เป็นไปได้:
- ผู้ใช้ลงชื่อเข้าใช้แล้ว แล้วคลิกลิงก์วิเศษที่เชื่อมโยงกับบัญชีผู้ใช้ปัจจุบัน ในกรณีนี้ Logto จะยังคงตรวจสอบโทเค็นใช้ครั้งเดียว และจัดเตรียมผู้ใช้เข้าสู่องค์กรที่ระบุหากจำเป็น
- ผู้ใช้ลงชื่อเข้าใช้แล้ว แล้วคลิกลิงก์วิเศษที่เชื่อมโยงกับบัญชีอื่น ในกรณีนี้ Logto จะถามผู้ใช้ว่าจะดำเนินการต่อในฐานะบัญชีใหม่ หรือกลับไปยังแอปพลิเคชันด้วยบัญชีปัจจุบัน
- หากผู้ใช้เลือกดำเนินการต่อในฐานะบัญชีใหม่ Logto จะสลับไปยังบัญชีใหม่หลังจากตรวจสอบโทเค็นสำเร็จ
- หากผู้ใช้เลือกใช้บัญชีปัจจุบัน Logto จะไม่ตรวจสอบโทเค็นและกลับไปยังแอปพลิเคชันด้วยบัญชีปัจจุบัน
- หาก prompt ของ sign-in ของคุณตั้งค่าเป็น "login" หรือมี "login" อยู่ Logto จะลงชื่อเข้าใช้บัญชีที่เชื่อมโยงกับโทเค็นใช้ครั้งเดียวโดยอัตโนมัติโดยไม่ถามสลับบัญชี เพราะ prompt "login" หมายถึงความตั้งใจชัดเจนในการยืนยันตัวตน ซึ่งจะมีลำดับความสำคัญเหนือเซสชันปัจจุบัน