我有一个登录页面,该页面使用以下方法验证用户身份
signInWithEmailAndPassword()
使用Javascript客户端SDK。
如果登录成功,则将用户(连同idToken)重定向到成员页面。
在服务器端(使用firebase admin SDK的nodejs),成员页面检查idToken的有效性,如果有效,则从Firebase获取用户特定的数据并将其显示在网页上。在会员页面上,有很多数据可供查看/编辑/删除等。因此,用户在此页面上花费的时间可能超过一个小时,这并非不可想象。
我的问题是,我找不到检测idToken是否已过期的方法。理想情况下,我想刷新并获取一个新的idToken。那可能吗?如果那不可能,我想在idToken过期时将用户重定向到登录页面。
但是我无法弄清楚如何实现两者之一。当idToken过期时,似乎没有触发onAuthStateChanged
和onIdTokenChanged
。而且我无法执行firebase.auth().currentUser.getIdToken(true)
这样的idToken的forceRefresh。因为在成员页面上,firebase.auth().currentUser
返回null。
关于如何处理这种情况的任何建议?
谢谢。
答案 0 :(得分:1)
使用Firebase Node.js Admin SDK,可以通过将verifyIdToken()
参数设置为checkRevoked
来调用true
时检查吊销ID令牌是否已过期。
verifyIdToken(idToken: string, checkRevoked?: boolean): Promise<DecodedIdToken>
checkedRevoked :布尔值
是否检查ID令牌是否被撤销。这需要向Firebase Auth后端提出额外的请求,以检查相应用户的tokensValidAfterTime
时间。如果未指定,则不应用此附加检查。
admin.auth().verifyIdToken(idToken, true)
.then(function(decodedToken) {
let uid = decodedToken.uid;
// ...
}).catch(function(error) {
// Handle error for expired ID token
});
或者,可以在客户端上检查ID令牌有效载荷声明。有关如何Verify ID tokens using a third-party JWT library的文档显示了有效负载声明。
exp
到期时间:必须在将来。时间是自UNIX时代以来的秒数。
jwt.io引用支持客户端令牌验证的库。
另请参阅:How to decode the JWT encoded token payload on client-side in angular 5?