Reactjs 来自数据库的令牌和过期日期,过期日期检查令牌是否已过期,如果已过期,则获取另一个令牌,并将旧的访问令牌替换为新的访问令牌,同时替换为新的过期日期,只需调用模块googleapis的方法refreshAccessToken,即可获取此新数据。注意:刷新标记永不过期
更新访问令牌后,使用它通过Google route(Reactjs 来自数据库的令牌和过期日期,过期日期检查令牌是否已过期,如果已过期,则获取另一个令牌,并将旧的访问令牌替换为新的访问令牌,同时替换为新的过期日期,只需调用模块googleapis的方法refreshAccessToken,即可获取此新数据。注意:刷新标记永不过期,reactjs,google-api,google-oauth,google-cloud-print,Reactjs,Google Api,Google Oauth,Google Cloud Print,更新访问令牌后,使用它通过Google route(../submit)将数据发送到打印机 代码: 接下来的所有代码仅在一个文件中 一些数据,如验证、静态变量、错误处理程序等,已被删除,以便更好地理解 路由获取URL身份验证 const express=require('express'); const google=require('googleapis'); const router=express.router(); var OAuth2=google.auth.OAuth2; con
../submit
)将数据发送到打印机
代码:
- 接下来的所有代码仅在一个文件中
- 一些数据,如验证、静态变量、错误处理程序等,已被删除,以便更好地理解
const express=require('express');
const google=require('googleapis');
const router=express.router();
var OAuth2=google.auth.OAuth2;
const redirect_url='1〕http://localhost:3001/setting'; //您的重定向URL
var oauth2Client=新的OAuth2(
'客户端ID',//用您的客户端ID替换它
'CLIEND SECRET',//将其替换为您的客户端密码
重定向url
);
var url=oauth2Client.generateAuthUrl({
访问类型:“脱机”,
范围:'https://www.googleapis.com/auth/cloudprint'
});
router.get('/googleurl',(req,res)=>{
返回资源状态(200)。发送({
结果:{googleURLToken:url}
});
});
使用身份验证代码获取令牌并将其保存在数据库中
const Setting=require('../models/Setting');//我的模型(猫鼬)
路由器.post('/googletoken',(请求,回复)=>{
oauth2Client.getToken(req.body.code,函数(err,令牌){
oauth2Client.credentials=令牌;
//如果刷新令牌退出,请保存它
//因为刷新令牌只返回了1次!重要
if(tokens.hasOwnProperty('refresh_token')){
让设置=新设置();
setting.refreshTokenGoogle=tokens.refresh\u token;
setting.expirationTokenGoogle=tokens.expiration\u date;
setting.tokenGoogle=tokens.access\u token;
设置。保存()
.然后((设置已创建)=>{
返回资源状态(200)。发送({
信息:“好的”
});
})
}
});
});
印刷
const axios=require('axios');
恒力矩=要求的(‘力矩’);
路由器.post('/print',异步(req,res)=>{
常量属性={
“版本”:“1.0”,
“打印”:{
“供应商票据项目”:[],
“颜色”:{“类型”:“标准单色”},
“副本”:{“副本”:1}
}
};
const accessToken=await getTokengologleUpdated();
axios.get(
'https://www.google.com/cloudprint/submit',
{
参数:{
printerid:printerid,//替换为您的打印机ID
标题:“标题打印机”,
票务:票务,
内容:“打印示例的文本!!!”,
contentType:“文本/普通”
},
标题:{
“授权”:“承载人”+accessToken
}
}
)
。然后(响应=>{
返回资源状态(200)。发送({
结果:应答。数据
});
})
}
);
异步函数getTokengologleUpdated(){
返回等待设置。查找({})
。然后(异步设置=>{
常量refreshTokenGoogle=设置[0]。refreshTokenGoogle;
const expirationTokenGoogle=设置[0]。expirationTokenGoogle;
const tokenGoogle=设置[0]。tokenGoogle;
const dateToday=新日期();
//提前1分钟以避免准确的时间
const dateTodayPlus1Minute=时刻(dateToday).add(1,'m').toDate();
const dateExpiration=新日期(expirationTokenGoogle);
//案例日期过期,获取新令牌
如果(日期到期<日期今天加1分钟){
log(“更新访问令牌”);
oauth2Client.credentials['refresh_token']=refreshTokenGoogle;
return wait oauth2Client.refreshAccessToken(异步函数(err,tokens){
//保存新令牌和新到期
正在设置[0]。expirationTokenGoogle=tokens.Expiration\u日期;
正在设置[0]。tokenGoogle=tokens.access\u token;
等待设置[0]。保存();
返回令牌。访问令牌;
});
}否则{
log(“使用旧的访问令牌”);
返回标记Google;
}
})
.catch(错误=>{
控制台日志(err);
});
}
如果您想使用Google Cloud Print,希望它能帮助您避免像我一样浪费大量时间。我已经解决了我的问题,关于所需的
用户凭据
的主要问题是因为我使用了不正确的访问令牌,而这是因为我获取的访问令牌不正确
我将解释我的整个解决方案,因为使用此API的代码示例很少
解决方案:
react google login
尝试获取访问令牌,而不是使用googleapis
模块之前,所描述的步骤都是正常的:- 下一步是获取URL并使用它进行用户身份验证。
正如我之前所说,我在前端使用模块
生成弹出窗口,只有这个模块需要URL。为了在后端获取URL,我使用了端点oauth open
,在这里我使用了/googleurl
方法