飞道科技

飞道科技文档总汇

长效登陆机制/记住我

web/h5

一定时间段时不需要登陆

一般这类应用在登陆的时候会有类似“一个月内不再登陆”这样的说明,只有当用户登陆信息失效后才需要重定向至登陆页面进行登陆,这种情况下,登陆页面时使用原子操作@dfeidao/atom-nodejs/msg/login-and-remember-me登陆,设置参数失效时间即可,完成之后设置sessionid到cookie。

import nodejs from '@dfeidao/atom-nodejs';
import { IncomingHttpHeaders } from 'http';

interface Message {
	usr: string;
	psw: string;
	query: {
		redirect: string;
	};
}

interface IWebResult {
	data: unknown;
	cookie?: {
		[name: string]: string;
	} | null;
	content_type?: string;
	headers?: {
		[key: string]: string;
	};
	attachment?: string;
	redirect?: string;
	status_code?: number;
}

export default async function atom({ usr, psw, query }: Message, action_id: string, session_id: string, headers: IncomingHttpHeaders): Promise<IWebResult> {
	const id = nodejs.str.uuid();
	const user_info = await nodejs.msg.login_and_remember_me(action_id, session_id, usr, psw, id, 720);
	if (query.redirect) {
		return {
			data: 1,	// 目前出于兼容性考虑,必须有该项,这里建议固定这样写
			cookie: {
				sessionid: user_info.sessionID
			},
			redirect: decodeURIComponent(query.redirect)
		};
	} else {
		return {
			data: 1,	// 目前出于兼容性考虑,必须有该项,这里建议固定这样写
			cookie: {
				sessionid: user_info.sessionID
			}
		};
	}
}

永久生效

这类应用适用于企业用户,一次登陆后永久记住用户状态,无须经常登陆(超过一个月未使用登陆情况除外)。登陆页面使用原子操作@dfeidao/atom-nodejs/msg/login-and-remember-me登陆

import nodejs from '@dfeidao/atom-nodejs';
import { IncomingHttpHeaders } from 'http';

interface Message {
	usr: string;
	psw: string;
	query: {
		redirect: string;
	};
}

interface IWebResult {
	data: unknown;
	cookie?: {
		[name: string]: string;
	} | null;
	content_type?: string;
	headers?: {
		[key: string]: string;
	};
	attachment?: string;
	redirect?: string;
	status_code?: number;
}

export default async function atom({ usr, psw, query }: Message, action_id: string, session_id: string, headers: IncomingHttpHeaders): Promise<IWebResult> {
	const id = nodejs.str.uuid();
	const user_info = await nodejs.msg.login_and_remember_me(action_id, session_id, usr, psw, id, 720);	// !!! 这里的720为30天的保持状态时间,具体项目应找项目经理确定该值
	if (query.redirect) {
		return {
			data: 1,	// 目前出于兼容性考虑,必须有该项,这里建议固定这样写
			cookie: {
				fdid: id,	// 只有web/h5项目需要将该id写入cookie,其它终端应从设备获取
				ticket: user_info.remember_me_ticket,
				sessionid: user_info.sessionID
			},
			redirect: decodeURIComponent(query.redirect)
		};
	} else {
		return {
			data: 1,	// 目前出于兼容性考虑,必须有该项,这里建议固定这样写
			cookie: {
				fdid: id,	// 只有web/h5项目需要将该id写入cookie,其它终端应从设备获取
				ticket: user_info.remember_me_ticket,
				sessionid: user_info.sessionID
			}
		};
	}
}

在每个页面(除登陆页面)客户端初始化时使用get方式

import { IFeidaoAiBrowserComponent } from '@dfeidao/atom-web/interfaces';
import get from '@dfeidao/atom-web/msg/get'

export default function a001(fd: IFeidaoAiBrowserComponent) {
	get('使用票根登陆服务', {});
}

调用下面这个服务

import nodejs from '@dfeidao/atom-nodejs';
import { IncomingHttpHeaders } from 'http';
import { productid, spaceid } from '../../atom/config';

interface Message {
	cookie: {
		fdid: string;
		ticket: string;
		sessionid: string;
		[key: string]: string;
	};
	urls: {
		base: string;
		origin: string;
		url: string;
	};
	// query: {};
	// params: {};
	// headers: {};
	// captcha: string;
}

interface IWebResult {
	data: unknown;
	cookie?: {
		[name: string]: string;
	} | null;
	content_type?: string;
	headers?: {
		[key: string]: string;
	};
	attachment?: string;
	redirect?: string;
	status_code?: number;
}

export default async function atom(message: Message, action_id: string, session_id: string, headers: IncomingHttpHeaders): Promise<IWebResult> {
	nodejs.logger.log('Service begin path:device-region/zj-000005/s002,action_id:' + action_id);

	try {
		const fdid = message.cookie.fdid;
		const ticket = message.cookie.ticket;

		const user_info = await nodejs.msg.user_login_with_ticket(fdid, ticket, productid, spaceid, session_id, action_id);

		nodejs.logger.log('Service end path:device-region/zj-000005/s002,action_id:' + action_id);
		return {
			data: 1,
			cookie: {
				fdid,
				ticket: user_info.remember_me_ticket,
				sessionid: user_info.sessionID
			}
		};
	} catch (error) {
		// TODO 需要判定错误类型,只有登陆失败才需要跳转至登陆页面
		return {
			data: 1,
			redirect: 'login.html?redirect=' + encodeURIComponent(message.urls.url)	// 把当前页面地址当参数传给登陆页面,以便登陆成功后跳转到当前页面
		};
	}
}

微信(小程序/公众号)

登陆

推荐的登陆方式是直接使用微信的openid跟当前系统用户绑定进行登陆,参数推荐使用最长时间720小时(30天,最少也应大于1天,即24小时)

原则上应当在每个服务中调用使用票根登陆,考虑到服务器压力,也可适当减少该登陆的频率,如在每个页面的初始化中调用一次(因为小程序有可能通过分享进入,初始进入的不一定是固定的页面)或首页初始化中调用一次(确定不会通过分享链接的方式通过其它页面进入的情况)

移动APP

桌面应用