You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

54 lines
1.3 KiB

  1. /**
  2. * NewApiLoginWidget - Headless login SDK
  3. *
  4. * Usage:
  5. * const result = await NewApiLoginWidget.login({
  6. * apiUrl: 'https://your-domain.com',
  7. * username: 'user',
  8. * password: 'pass'
  9. * });
  10. */
  11. async function login({ apiUrl, username, password }) {
  12. if (!apiUrl) {
  13. throw new Error('NewApiLoginWidget: apiUrl is required');
  14. }
  15. if (!username || !username.trim()) {
  16. return { success: false, message: '请输入用户名' };
  17. }
  18. if (!password) {
  19. return { success: false, message: '请输入密码' };
  20. }
  21. const url = apiUrl.replace(/\/+$/, '') + '/api/user/login';
  22. try {
  23. const res = await fetch(url, {
  24. method: 'POST',
  25. headers: { 'Content-Type': 'application/json' },
  26. credentials: 'include',
  27. body: JSON.stringify({ username: username.trim(), password }),
  28. });
  29. const data = await res.json();
  30. if (data.success) {
  31. if (data.data && data.data.require_2fa) {
  32. return {
  33. success: false,
  34. message: '此账户启用了两步验证,暂不支持通过 Widget 登录',
  35. };
  36. }
  37. return { success: true, data: data.data };
  38. }
  39. return { success: false, message: data.message || '登录失败' };
  40. } catch (err) {
  41. return { success: false, message: '网络错误,请检查网络连接' };
  42. }
  43. }
  44. window.NewApiLoginWidget = { login };
  45. export { login };