Commit ad57b81f by 庄冰

cache feishu

parent 1ef3c589
...@@ -29,10 +29,20 @@ class feishuUserAccessTokenCache extends CacheBase{ ...@@ -29,10 +29,20 @@ class feishuUserAccessTokenCache extends CacheBase{
return null; return null;
} }
async set(obj,openid){ async set(obj,openid){
var expire = 7100;
if(obj.expires_in){
var time = obj.expires_in;
var now = Date.parse(new Date())/1000;
if(now<time){
expire = time - now;
}else{
return null;
}
}
var key = this.prefix+"_"+openid; var key = this.prefix+"_"+openid;
if(obj && obj.access_token){ if(obj && obj.access_token){
var stringobj = JSON.stringify(obj); var stringobj = JSON.stringify(obj);
await this.redisClient.setWithEx(key,stringobj,7100); await this.redisClient.setWithEx(key,stringobj,expire);
return obj; return obj;
} }
return null; return null;
......
...@@ -106,6 +106,9 @@ class UtilsFeishuService{ ...@@ -106,6 +106,9 @@ class UtilsFeishuService{
} }
return system.getResultFail("获取appAccessToken失败"); return system.getResultFail("获取appAccessToken失败");
} }
//------------------------飞书网页开发---------------------------------------------------------------
//获取登录用户身份 //获取登录用户身份
async getUserAccessToken(obj){ async getUserAccessToken(obj){
var resData = {}; var resData = {};
...@@ -160,6 +163,43 @@ class UtilsFeishuService{ ...@@ -160,6 +163,43 @@ class UtilsFeishuService{
} }
return system.getResult(null, "获取飞书用户信息失败"); return system.getResult(null, "获取飞书用户信息失败");
} }
//------------------------飞书网页开发-------结束--------------------------------------------------------
//------------------------飞书小程序开发---------------------------------------------------------------
//获取登录用户身份 session_key 和 openId
async tokenLoginValidate(obj){
var resData = {};
if(obj.open_id){
//缓存中获取登录用户身份
resData = await this.cacheManager["feishuUserAccessTokenCache"].get(obj.open_id);
}
//缓存中存在 直接返回
if(resData && resData.access_token){
return system.getResultSuccess(resData);
}
if(!obj.code){
return system.getResultFail("code参数不能为空");
}
if(!obj.app_access_token){
return system.getResultFail("app_access_token参数不能为空");
}
var url = "https://open.feishu.cn/open-apis/mina/v2/tokenLoginValidate";
var fsObj={
token:obj.app_access_token,//应用的 app_access_token,必须与请求身份验证中的应用保持一致
code:obj.code //来自请求身份验证(新)流程,用户扫码登录后会自动302到redirect_uri并带上此参数
};
var rtn = await this.execClient.execFeishuPost(fsObj, url);
if (!rtn || !rtn.stdout) {
return system.getResult(null, "execPost data is empty");
}
var result = JSON.parse(rtn.stdout);
if(result.code==0 && result.data){
//缓存AppAccessToken
await this.cacheManager["feishuUserAccessTokenCache"].set(result.data,result.data.open_id);
return system.getResultSuccess(result.data);
}
return system.getResult(null, "获取飞书登录用户身份失败");
}
//------------------------飞书小程序开发------结束---------------------------------------------------------
getUUID() { getUUID() {
var uuid = uuidv4(); var uuid = uuidv4();
...@@ -185,7 +225,8 @@ class UtilsFeishuService{ ...@@ -185,7 +225,8 @@ class UtilsFeishuService{
var userAccessTokenParams = { var userAccessTokenParams = {
"code":pobj.code,"app_access_token":app_access_token,"open_id":pobj.open_id || "" "code":pobj.code,"app_access_token":app_access_token,"open_id":pobj.open_id || ""
}; };
var userAccessTokenRes = await this.getUserAccessToken(userAccessTokenParams); // var userAccessTokenRes = await this.getUserAccessToken(userAccessTokenParams);
var userAccessTokenRes = await this.tokenLoginValidate(userAccessTokenParams);
if(userAccessTokenRes.status!=0){ if(userAccessTokenRes.status!=0){
return userAccessTokenRes; return userAccessTokenRes;
} }
...@@ -198,13 +239,11 @@ class UtilsFeishuService{ ...@@ -198,13 +239,11 @@ class UtilsFeishuService{
"actionBody": { "actionBody": {
"openId":userAccessTokenObj.open_id, "openId":userAccessTokenObj.open_id,
"channelUserId":userAccessTokenObj.open_id,// Y 渠道用户ID "channelUserId":userAccessTokenObj.open_id,// Y 渠道用户ID
"channelUserName":userAccessTokenObj.name,// N 渠道用户名
"nickName":userAccessTokenObj.name, // N 用户昵称
"head_url":userAccessTokenObj.avatar_url //头像
} }
}; };
var loginByUserNameRes = await this.getLoginByUserName(loginByUserNameParams); var loginByUserNameRes = await this.getLoginByUserName(loginByUserNameParams);
if(loginByUserNameRes && loginByUserNameRes.status==0){ if(loginByUserNameRes && loginByUserNameRes.status==0){
loginByUserNameRes.data.open_id = userAccessTokenObj.open_id;
return loginByUserNameRes;//获取userpin直接返回 return loginByUserNameRes;//获取userpin直接返回
} }
// // 获取飞书用户信息 // // 获取飞书用户信息
......
...@@ -8,6 +8,8 @@ class ExecClient { ...@@ -8,6 +8,8 @@ class ExecClient {
this.cmdGetPattern = "curl -G -X GET '{url}'"; this.cmdGetPattern = "curl -G -X GET '{url}'";
this.cmdPushDataPostPattern = "curl -k -H 'Content-type: application/json' -H 'token:{tk}' -H 'request-id:{requestId}' -d '{data}' {url}"; this.cmdPushDataPostPattern = "curl -k -H 'Content-type: application/json' -H 'token:{tk}' -H 'request-id:{requestId}' -d '{data}' {url}";
this.cmdFeishuGetPattern = "curl -X GET -k -H 'Content-Type: application/json' -H 'Authorization: {Authorization}' -d '{data}' {url} "; this.cmdFeishuGetPattern = "curl -X GET -k -H 'Content-Type: application/json' -H 'Authorization: {Authorization}' -d '{data}' {url} ";
this.cmdFeishuPostPattern = "curl -k -H 'Content-type: application/json' -H 'Authorization: {Authorization}' -d '{data}' {url}";
} }
getUUID() { getUUID() {
var uuid = uuidv4(); var uuid = uuidv4();
...@@ -33,6 +35,13 @@ class ExecClient { ...@@ -33,6 +35,13 @@ class ExecClient {
console.log(cmd); console.log(cmd);
return cmd; return cmd;
} }
FetchFeishuPostCmd(subData, url) {
var data = JSON.stringify(subData);
var cmd = this.cmdFeishuPostPattern.replace(/\{data\}/g,
data).replace(/\{url\}/g, url).replace(/\{Authorization\}/g, "Bearer "+subData.token);
console.log(cmd);
return cmd;
}
FetchPushDataPostCmd(subData, url, token, requestId) { FetchPushDataPostCmd(subData, url, token, requestId) {
var requestId = requestId || this.getUUID(); var requestId = requestId || this.getUUID();
var data = JSON.stringify(subData); var data = JSON.stringify(subData);
...@@ -46,6 +55,11 @@ class ExecClient { ...@@ -46,6 +55,11 @@ class ExecClient {
var result = await this.exec(cmd); var result = await this.exec(cmd);
return result; return result;
} }
async execFeishuPost(subData, url) {
let cmd = this.FetchFeishuPostCmd(subData, url);
var result = await this.exec(cmd);
return result;
}
async execPushDataPost(subData, url, token, requestId) { async execPushDataPost(subData, url, token, requestId) {
let cmd = this.FetchPushDataPostCmd(subData, url, token, requestId); let cmd = this.FetchPushDataPostCmd(subData, url, token, requestId);
var result = await this.exec(cmd); var result = await this.exec(cmd);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment