Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs 来自数据库的令牌和过期日期,过期日期检查令牌是否已过期,如果已过期,则获取另一个令牌,并将旧的访问令牌替换为新的访问令牌,同时替换为新的过期日期,只需调用模块googleapis的方法refreshAccessToken,即可获取此新数据。注意:刷新标记永不过期_Reactjs_Google Api_Google Oauth_Google Cloud Print - Fatal编程技术网

Reactjs 来自数据库的令牌和过期日期,过期日期检查令牌是否已过期,如果已过期,则获取另一个令牌,并将旧的访问令牌替换为新的访问令牌,同时替换为新的过期日期,只需调用模块googleapis的方法refreshAccessToken,即可获取此新数据。注意:刷新标记永不过期

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

更新访问令牌后,使用它通过Google route(
../submit
)将数据发送到打印机

代码:

  • 接下来的所有代码仅在一个文件中
  • 一些数据,如验证、静态变量、错误处理程序等,已被删除,以便更好地理解
路由获取URL身份验证

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
    模块之前,所描述的步骤都是正常的:

  • 同样为了避免CORS问题(并且不使用CORS chrome插件),我在服务器端将请求写入GoogleAPI

  • 我在前端也遇到了一个问题,当我试图生成一个弹出窗口来授予打印机权限时(关于CORS的问题),我的解决方案是使用这个非常简单的模块进行身份验证:

  • 总体方案:

    说明:

    知道我有我的问题帖子中描述的所有数据(直到第三步)

    身份验证:

    • 下一步是获取URL并使用它进行用户身份验证。 正如我之前所说,我在前端使用模块
      oauth open
      生成弹出窗口,只有这个模块需要URL。为了在后端获取URL,我使用了端点
      /googleurl
      ,在这里我使用了
      方法