Skip to content

Commit ebcfcc9

Browse files
authored
Merge pull request #37 from firebase/add-snippets
Adding snippets for more Auth pages
2 parents d85140b + a758f4f commit ebcfcc9

File tree

5 files changed

+293
-2
lines changed

5 files changed

+293
-2
lines changed

auth/import_users.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ admin.initializeApp();
44

55
//[START build_user_list]
66
// Up to 1000 users can be imported at once.
7-
var userImportRecords = [
7+
let userImportRecords = [
88
{
99
uid: 'uid1',
1010
@@ -21,7 +21,7 @@ var userImportRecords = [
2121
];
2222
//[END build_user_list]
2323

24-
var userImportOptions = {
24+
let userImportOptions = {
2525
hash: {
2626
algorithm: 'HMAC_SHA256',
2727
key: Buffer.from('secretKey')

auth/manage_cookies.js

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
'use strict';
2+
const admin = require('firebase-admin');
3+
admin.initializeApp();
4+
const express = require('express');
5+
const app = express();
6+
7+
// [START session_login]
8+
app.post('/sessionLogin', (req, res) => {
9+
// Get the ID token passed and the CSRF token.
10+
const idToken = req.body.idToken.toString();
11+
const csrfToken = req.body.csrfToken.toString();
12+
// Guard against CSRF attacks.
13+
if (csrfToken !== req.cookies.csrfToken) {
14+
res.status(401).send('UNAUTHORIZED REQUEST!');
15+
return;
16+
}
17+
// Set session expiration to 5 days.
18+
const expiresIn = 60 * 60 * 24 * 5 * 1000;
19+
// Create the session cookie. This will also verify the ID token in the process.
20+
// The session cookie will have the same claims as the ID token.
21+
// To only allow session cookie setting on recent sign-in, auth_time in ID token
22+
// can be checked to ensure user was recently signed in before creating a session cookie.
23+
admin.auth().createSessionCookie(idToken, {expiresIn}).then((sessionCookie) => {
24+
// Set cookie policy for session cookie.
25+
const options = {maxAge: expiresIn, httpOnly: true, secure: true};
26+
res.cookie('session', sessionCookie, options);
27+
res.end(JSON.stringify({status: 'success'}));
28+
}, error => {
29+
res.status(401).send('UNAUTHORIZED REQUEST!');
30+
});
31+
});
32+
// [END session_login]
33+
34+
app.post('/verifyToken', (req, res) => {
35+
// Get the ID token.
36+
const idToken = req.body.idToken.toString();
37+
// Set session expiration to 5 days.
38+
const expiresIn = 60 * 60 * 24 * 5 * 1000;
39+
// [START check_auth_time]
40+
admin.auth().verifyIdToken(idToken).then((decodedIdToken) => {
41+
// Only process if the user just signed in in the last 5 minutes.
42+
if (new Date().getTime() / 1000 - decodedIdToken.auth_time < 5 * 60) {
43+
// Create session cookie and set it.
44+
return admin.auth().createSessionCookie(idToken, {expiresIn});
45+
}
46+
// A user that was not recently signed in is trying to set a session cookie.
47+
// To guard against ID token theft, require re-authentication.
48+
res.status(401).send('Recent sign in required!');
49+
});
50+
// [END check_auth_time]
51+
});
52+
53+
// [START session_verify]
54+
// Whenever a user is accessing restricted content that requires authentication.
55+
app.post('/profile', (req, res) => {
56+
const sessionCookie = req.cookies.session || '';
57+
// Verify the session cookie. In this case an additional check is added to detect
58+
// if the user's Firebase session was revoked, user deleted/disabled, etc.
59+
admin.auth().verifySessionCookie(
60+
sessionCookie, true /** checkRevoked */).then((decodedClaims) => {
61+
serveContentForUser('/profile', req, res, decodedClaims);
62+
}).catch(error => {
63+
// Session cookie is unavailable or invalid. Force user to login.
64+
res.redirect('/login');
65+
});
66+
});
67+
// [END session_verify]
68+
69+
app.post('/verifySessionCookie', (req, res) => {
70+
const sessionCookie = req.cookies.session || '';
71+
// [START session_verify_with_permission_check]
72+
admin.auth().verifySessionCookie(sessionCookie, true).then((decodedClaims) => {
73+
// Check custom claims to confirm user is an admin.
74+
if (decodedClaims.admin === true) {
75+
return serveContentForAdmin('/admin', req, res, decodedClaims);
76+
}
77+
res.status(401).send('UNAUTHORIZED REQUEST!');
78+
}).catch(error => {
79+
// Session cookie is unavailable or invalid. Force user to login.
80+
res.redirect('/login');
81+
});
82+
// [END session_verify_with_permission_check]
83+
});
84+
85+
86+
// [START session_clear]
87+
app.post('/sessionLogout', (req, res) => {
88+
res.clearCookie('session');
89+
res.redirect('/login');
90+
});
91+
// [END session_clear]
92+
93+
// [START session_clear_and_revoke]
94+
app.post('/sessionLogout', (req, res) => {
95+
const sessionCookie = req.cookies.session || '';
96+
res.clearCookie('session');
97+
admin.auth().verifySessionCookie(sessionCookie).then((decodedClaims) => {
98+
return admin.auth().revokeRefreshTokens(decodedClaims.sub);
99+
}).then(() => {
100+
res.redirect('/login');
101+
}).catch((error) => {
102+
res.redirect('/login');
103+
});
104+
});
105+
// [END session_clear_and_revoke]
106+
107+
function serveContentForAdmin(){}
108+
function serveContentForUser(){}

auth/manage_sessions.js

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
'use strict';
2+
const admin = require('firebase-admin');
3+
admin.initializeApp();
4+
5+
// [START revoke_tokens]
6+
// Revoke all refresh tokens for a specified user for whatever reason.
7+
// Retrieve the timestamp of the revocation, in seconds since the epoch.
8+
admin.auth().revokeRefreshTokens(uid)
9+
.then(() => {
10+
return admin.auth().getUser(uid);
11+
})
12+
.then((userRecord) => {
13+
return new Date(userRecord.tokensValidAfterTime).getTime() / 1000;
14+
})
15+
.then((timestamp) => {
16+
console.log('Tokens revoked at: ', timestamp);
17+
});
18+
// [END revoke_tokens]
19+
20+
// [START save_revocation_in_db]
21+
const metadataRef = admin.database().ref('metadata/' + uid);
22+
metadataRef.set({revokeTime: utcRevocationTimeSecs})
23+
.then(() => {
24+
console.log('Database updated successfully.');
25+
});
26+
// [END save_revocation_in_db]
27+
28+
// [START verify_id_token_check_revoked]
29+
// Verify the ID token while checking if the token is revoked by passing
30+
// checkRevoked true.
31+
let checkRevoked = true;
32+
admin.auth().verifyIdToken(idToken, checkRevoked)
33+
.then(payload => {
34+
// Token is valid.
35+
})
36+
.catch(error => {
37+
if (error.code == 'auth/id-token-revoked') {
38+
// Token has been revoked. Inform the user to reauthenticate or signOut() the user.
39+
} else {
40+
// Token is invalid.
41+
}
42+
});
43+
// [END verify_id_token_check_revoked]
44+
45+
let uid, idToken, utcRevocationTimeSecs;

auth/manage_users.js

Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
'use strict';
2+
const admin = require('firebase-admin');
3+
admin.initializeApp();
4+
5+
// [START get_user_by_id]
6+
admin.auth().getUser(uid)
7+
.then(function(userRecord) {
8+
// See the UserRecord reference doc for the contents of userRecord.
9+
console.log('Successfully fetched user data:', userRecord.toJSON());
10+
})
11+
.catch(function(error) {
12+
console.log('Error fetching user data:', error);
13+
});
14+
// [END get_user_by_id]
15+
16+
// [START get_user_by_email]
17+
admin.auth().getUserByEmail(email)
18+
.then(function(userRecord) {
19+
// See the UserRecord reference doc for the contents of userRecord.
20+
console.log('Successfully fetched user data:', userRecord.toJSON());
21+
})
22+
.catch(function(error) {
23+
console.log('Error fetching user data:', error);
24+
});
25+
// [END get_user_by_email]
26+
27+
// [START get_user_by_phone]
28+
admin.auth().getUserByPhoneNumber(phoneNumber)
29+
.then(function(userRecord) {
30+
// See the UserRecord reference doc for the contents of userRecord.
31+
console.log('Successfully fetched user data:', userRecord.toJSON());
32+
})
33+
.catch(function(error) {
34+
console.log('Error fetching user data:', error);
35+
});
36+
// [END get_user_by_phone]
37+
38+
// [START create_user]
39+
admin.auth().createUser({
40+
41+
emailVerified: false,
42+
phoneNumber: '+11234567890',
43+
password: 'secretPassword',
44+
displayName: 'John Doe',
45+
photoURL: 'http://www.example.com/12345678/photo.png',
46+
disabled: false
47+
})
48+
.then(function(userRecord) {
49+
// See the UserRecord reference doc for the contents of userRecord.
50+
console.log('Successfully created new user:', userRecord.uid);
51+
})
52+
.catch(function(error) {
53+
console.log('Error creating new user:', error);
54+
});
55+
// [END create_user]
56+
57+
// [START create_user_with_uid]
58+
admin.auth().createUser({
59+
uid: 'some-uid',
60+
61+
phoneNumber: '+11234567890'
62+
})
63+
.then(function(userRecord) {
64+
// See the UserRecord reference doc for the contents of userRecord.
65+
console.log('Successfully created new user:', userRecord.uid);
66+
})
67+
.catch(function(error) {
68+
console.log('Error creating new user:', error);
69+
});
70+
// [END create_user_with_uid]
71+
72+
// [START update_user]
73+
admin.auth().updateUser(uid, {
74+
75+
phoneNumber: '+11234567890',
76+
emailVerified: true,
77+
password: 'newPassword',
78+
displayName: 'Jane Doe',
79+
photoURL: 'http://www.example.com/12345678/photo.png',
80+
disabled: true
81+
})
82+
.then(function(userRecord) {
83+
// See the UserRecord reference doc for the contents of userRecord.
84+
console.log('Successfully updated user', userRecord.toJSON());
85+
})
86+
.catch(function(error) {
87+
console.log('Error updating user:', error);
88+
});
89+
// [END update_user]
90+
91+
// [START delete_user]
92+
admin.auth().deleteUser(uid)
93+
.then(function() {
94+
console.log('Successfully deleted user');
95+
})
96+
.catch(function(error) {
97+
console.log('Error deleting user:', error);
98+
});
99+
// [END delete_user]
100+
101+
// [START list_all_users]
102+
function listAllUsers(nextPageToken) {
103+
// List batch of users, 1000 at a time.
104+
admin.auth().listUsers(1000, nextPageToken)
105+
.then(function(listUsersResult) {
106+
listUsersResult.users.forEach(function(userRecord) {
107+
console.log('user', userRecord.toJSON());
108+
});
109+
if (listUsersResult.pageToken) {
110+
// List next batch of users.
111+
listAllUsers(listUsersResult.pageToken);
112+
}
113+
})
114+
.catch(function(error) {
115+
console.log('Error listing users:', error);
116+
});
117+
}
118+
// Start listing users from the beginning, 1000 at a time.
119+
listAllUsers();
120+
// [END list_all_users]
121+
122+
let uid, email, phoneNumber;

auth/verify_id_tokens.js

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
'use strict';
2+
const admin = require('firebase-admin');
3+
admin.initializeApp();
4+
5+
// [START verify_id_token]
6+
// idToken comes from the client app
7+
admin.auth().verifyIdToken(idToken)
8+
.then(function(decodedToken) {
9+
var uid = decodedToken.uid;
10+
// ...
11+
}).catch(function(error) {
12+
// Handle error
13+
});
14+
// [END verify_id_token]
15+
16+
let idToken;

0 commit comments

Comments
 (0)