我不明白應該怎么做才能防止同一用戶多次登錄。我在帶有 JWT 令牌的 React Node 應用程式中使用帶有 firebase 的 google 登錄。如果從其他瀏覽器或其他設備登錄,如何使用戶注銷。是否有任何庫可以處理此問題或我可以以任何方式實作此目標?我已經檢查了很多鏈接,但你沒有這樣做的具體方法。
中間件認證
const auth = async (req, res, next) => {
try {
const token = req.headers.authorization.split(" ")[1];
let decodedData = verifyToken(token);
req.userId = decodedData?.id;
next();
} catch (error) {
console.log(error);
throw new Error()
}
};
這就是我驗證令牌的方式
export const verifyIdToken = async (idToken) => {
try {
return await admin.auth().verifyIdToken(idToken);
} catch (e) {
console.log(e);
throw new Error(e)
}
}
控制器 auth.js
export const signin = async (req, res) => {
try {
const code = req.body.code;
let profile = await verifyIdToken(code);
const newUser = {
uid: profile.uid,
name: profile.name,
email: profile.email,
};
let user = await db.aggregate('USER', query);
user = user[0];
if (!user) {
user = await db.create('USER', newUser);
}
const token = generateToken(user);
res.status(200).json({ user, token });
} catch (err) {
console.log(err)
res.status(500).json({ message: "Something went wrong" });
}
};
export const refreshToken = async (req, res) => {
try {
let user = await db.aggregate('USER', query);
user = user[0];
const token = generateToken(user);
res.status(200).json({ user, token });
} catch (err) {
console.log(err)
res.status(500).json({ message: "Something went wrong" });
}
};
uj5u.com熱心網友回復:
可能有不同的方法可以做到這一點,但我認為,這種方式也可以。
首先向您的用戶資料庫添加兩個欄位
isLogedIn: (which should be false initially)
另一個領域
userBrowser: ( set to null initially)
然后在驗證用戶時,在檢查用戶名和密碼后,還要檢查isLogerIn是假還是真,如果是真可以向用戶回傳訊息。但如果為 false,您可以在身份驗證后將其設定為 true。你可以通過以下方式獲得瀏覽資訊
req.headers["user-agent"]
并userBrowser在對用戶進行身份驗證后將其設定為。因此,在進行身份驗證時,您檢查是否為isLogedIn真,您可以發送一條訊息,例如
error: user already logger in, with (the brower nane already in database: userBrowser)
uj5u.com熱心網友回復:
- 將 Firebase Admin SDK 安裝到您的服務器。請點擊此鏈接:https ://firebase.google.com/docs/admin/setup?hl=en
- 創建 API 可以接收用戶的 uid,然后撤銷當前會話。查看更多: https ://firebase.google.com/docs/auth/admin/manage-sessions?hl=en
getAuth()
.revokeRefreshTokens(uid)
.then(() => {
return getAuth().getUser(uid);
})
.then((userRecord) => {
return new Date(userRecord.tokensValidAfterTime).getTime() / 1000;
})
.then((timestamp) => {
console.log(`Tokens revoked at: ${timestamp}`);
});
然后其他用戶將有無效的令牌,所以密切注銷。
- 檢查 idToken 吊銷:https ://firebase.google.com/docs/auth/admin/manage-sessions?hl=en#detect_id_token_revocation_in_the_sdk
// Verify the ID token while checking if the token is revoked by passing
// checkRevoked true.
let checkRevoked = true;
getAuth()
.verifyIdToken(idToken, checkRevoked)
.then((payload) => {
// Token is valid.
})
.catch((error) => {
if (error.code == 'auth/id-token-revoked') {
// Token has been revoked. Inform the user to reauthenticate or signOut() the user.
} else {
// Token is invalid.
}
});
希望以上資訊對您有所幫助。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/480085.html
標籤:节点.js 反应 安全 firebase 身份验证 jwt
上一篇:帶有包名的Python匯入模塊
下一篇:如何保護Mule應用程式的流量
