|
@@ -109,6 +109,14 @@ export class App implements OnInit {
|
|
|
this.userId = params.get('user') || params.get('userid') || '';
|
|
this.userId = params.get('user') || params.get('userid') || '';
|
|
|
this.apigId = params.get('apigid') || 'Vo3ROWEvDy';
|
|
this.apigId = params.get('apigid') || 'Vo3ROWEvDy';
|
|
|
this.funId = params.get('fun_id') || DEFAULT_FUN_ID;
|
|
this.funId = params.get('fun_id') || DEFAULT_FUN_ID;
|
|
|
|
|
+ const urlToken = params.get('token') || '';
|
|
|
|
|
+
|
|
|
|
|
+ // 0. URL 携带 token → 使用 Parse become 登录
|
|
|
|
|
+ if (urlToken) {
|
|
|
|
|
+ console.log('[AUTH] URL 携带 token,使用 become 登录...');
|
|
|
|
|
+ this.becomeWithToken(urlToken);
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
// 1. URL 已提供足够参数 → 直接加载
|
|
// 1. URL 已提供足够参数 → 直接加载
|
|
|
if (this.authId || (this.userId && this.apigId)) {
|
|
if (this.authId || (this.userId && this.apigId)) {
|
|
@@ -136,6 +144,47 @@ export class App implements OnInit {
|
|
|
this.needLogin = true;
|
|
this.needLogin = true;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 通过 URL 中的 token 调用 Parse Server 的 become(fetch /parse/users/me)完成登录
|
|
|
|
|
+ */
|
|
|
|
|
+ async becomeWithToken(token: string): Promise<void> {
|
|
|
|
|
+ try {
|
|
|
|
|
+ const resp = await fetch(`${API_BASE}/parse/users/me?include=company`, {
|
|
|
|
|
+ headers: {
|
|
|
|
|
+ 'X-Parse-Application-Id': APP_ID,
|
|
|
|
|
+ 'X-Parse-Session-Token': token
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
+ const data = await resp.json();
|
|
|
|
|
+ if (!data.objectId) {
|
|
|
|
|
+ console.warn('[AUTH] become 失败,token 无效:', data);
|
|
|
|
|
+ this.errorMsg = 'Token 无效或已过期,请重新登录。';
|
|
|
|
|
+ this.needLogin = true;
|
|
|
|
|
+ this.cdr.detectChanges();
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ // become 成功 — 写入状态
|
|
|
|
|
+ this.userId = data.objectId;
|
|
|
|
|
+ this.sessionToken = token;
|
|
|
|
|
+ this.loggedInUser = data.nickname || data.username || data.mobilePhoneNumber || data.objectId;
|
|
|
|
|
+ this.companyId = data.company?.objectId || '';
|
|
|
|
|
+ console.log('[AUTH] become 成功, user:', data.objectId, data.username || '', 'company:', this.companyId || '(无)');
|
|
|
|
|
+
|
|
|
|
|
+ // 持久化到 localStorage
|
|
|
|
|
+ localStorage.setItem('apig_user_id', this.userId);
|
|
|
|
|
+ localStorage.setItem('apig_session_token', token);
|
|
|
|
|
+ localStorage.setItem('apig_display_name', this.loggedInUser);
|
|
|
|
|
+
|
|
|
|
|
+ this.cdr.detectChanges();
|
|
|
|
|
+ this.loadApig();
|
|
|
|
|
+ } catch (e: any) {
|
|
|
|
|
+ console.error('[AUTH] become 请求异常:', e);
|
|
|
|
|
+ this.errorMsg = 'Token 登录失败: ' + e.message;
|
|
|
|
|
+ this.needLogin = true;
|
|
|
|
|
+ this.cdr.detectChanges();
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
async validateAndLoad(token: string, userId: string): Promise<void> {
|
|
async validateAndLoad(token: string, userId: string): Promise<void> {
|
|
|
try {
|
|
try {
|
|
|
const resp = await fetch(`${API_BASE}/parse/users/me?include=company`, {
|
|
const resp = await fetch(`${API_BASE}/parse/users/me?include=company`, {
|