我目前正在使用 Firebase 在 React/Node 應用程式中對我的用戶進行身份驗證,但我還想在自己的資料庫中存盤其他用戶資料,我通過將 Firebase 存盤uid在每個用戶上來做到這一點,我想得到一些輸入在我的實施中,以確保我走在正確的軌道上。
我的前端代碼如下:
- 這用作
onClick“繼續使用 Google”按鈕:
const googleSignIn = async () =>
signInWithPopup(auth, new GoogleAuthProvider());
- 當上面的彈出承諾完成時,
auth.onAuthStateChanged會在下面觸發useEffect,它(在登錄/注冊時)將觸發函式applicationAuthentication,傳入從 Firebase 回傳的用戶物件:
useEffect(() => {
const unsubscribe = auth.onAuthStateChanged(firebaseUser => {
if (!firebaseUser) {
return dispatch(logUserOut());
}
return applicationAuthentication(firebaseUser);
});
return unsubscribe;
}, []);
- 該
applicationAuthentication如下外觀:
const applicationAuthentication = async (firebaseUser: User) => {
try {
const idToken = await firebaseUser.getIdToken();
const { data } = await axios.get('/api/users/authenticate/signin', {
headers: {
Authorization: `Bearer ${idToken}`
}
});
const { user, error } = data;
if (error) {
throw new Error(error.message);
}
dispatch(logUserIn({ user, accessToken: idToken }));
} catch (error: any) {
dispatch(setUserError(error.message));
console.log(error.message);
}
};
在我的節點快遞服務器中,路由發生以下情況/api/users/authenticate/signin;這是我通過使用資料訪問方法與我自己的資料庫進行通信的地方,findUserByFirebaseUID并createUser使用uid來自令牌的來檢查用戶是否存在,如果不存在,則創建一個新用戶(請注意首先檢查的中間件,如下所述):
usersRouter.get(
'/authenticate/signin',
async (req: Request, res: Response, next: NextFunction) => {
try {
const uid = res.locals.uid; // set by token middlewear function
let firstLogin = false;
let user = await findUserByFirebaseId(uid);
if (!user) {
firstLogin = true;
user = await createUser(uid);
}
res.json({ user, firstLogin });
} catch (error) {
next(error);
}
}
);
它使用以下authenticate中間件功能對用戶進行身份驗證firebase-admin:
const authenticate = async (
req: Request,
res: Response,
next: NextFunction
) => {
try {
const idToken = req.headers.authorization.split(' ')[1];
const decodedToken = await admin.auth().verifyIdToken(idToken);
if (decodedToken) {
const { uid } = decodedToken;
res.locals.uid = uid;
return next();
}
return res.status(400).json({ message: 'Unauthorized Request' });
} catch (error) {
next({ message: 'Invalid Token' });
}
};
app.use(authenticate);
使用uid來檢查我自己的資料庫的整個流程看起來是否正確?我是否正確實作了令牌中間件?
我很想聽聽對此的任何想法!
uj5u.com熱心網友回復:
是的,您將 ID 令牌從客戶端傳遞到服務器,然后在服務器上對其進行解碼(在中間件中)以安全地確定 UID 的方式類似于 Firebase 自己的服務執行此操作的方式。
如果您將 ID 令牌傳遞給其他請求以對其進行授權,請考慮保留最近的原始和解碼 ID 令牌的快取,以防止必須在每個請求上對其進行解碼。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/409502.html
標籤:
