Các hàm chặn cho phép bạn thực thi mã tuỳ chỉnh để sửa đổi kết quả của một người dùng đăng ký hoặc đăng nhập vào ứng dụng của bạn. Ví dụ: bạn có thể ngăn người dùng xác thực nếu họ không đáp ứng một số tiêu chí nhất định hoặc cập nhật thông tin của người dùng trước khi trả thông tin đó về ứng dụng khách của bạn.
Trước khi bắt đầu
Để sử dụng các chức năng chặn, bạn phải nâng cấp dự án Firebase của mình lên Firebase Authentication with Identity Platform. Nếu bạn chưa nâng cấp, hãy nâng cấp trước.
Tìm hiểu về các hàm chặn
Bạn có thể đăng ký các hàm chặn cho những sự kiện này:
beforeCreate
: Kích hoạt trước khi người dùng mới được lưu vào cơ sở dữ liệu Firebase Authentication và trước khi mã thông báo được trả về cho ứng dụng khách của bạn.beforeSignIn
: Kích hoạt sau khi thông tin đăng nhập của người dùng được xác minh, nhưng trước khi Firebase Authentication trả về mã nhận dạng cho ứng dụng khách của bạn. Nếu ứng dụng của bạn sử dụng tính năng xác thực đa yếu tố, thì hàm này sẽ kích hoạt sau khi người dùng xác minh yếu tố thứ hai. Xin lưu ý rằng việc tạo người dùng mới cũng kích hoạtbeforeSignIn
, ngoàibeforeCreate
.beforeEmail
(Chỉ Node.js): Kích hoạt trước khi email (ví dụ: email đăng nhập hoặc đặt lại mật khẩu) được gửi cho người dùng.beforeSms
(Chỉ Node.js): Kích hoạt trước khi một Tin nhắn SMS được gửi đến người dùng, chẳng hạn như trong trường hợp xác thực đa yếu tố.
Khi sử dụng các chức năng chặn, hãy lưu ý những điều sau:
Hàm của bạn phải phản hồi trong vòng 7 giây. Sau 7 giây, Firebase Authentication sẽ trả về một lỗi và thao tác của ứng dụng sẽ không thành công.
Các mã phản hồi HTTP khác ngoài
200
sẽ được chuyển đến các ứng dụng khách của bạn. Đảm bảo mã ứng dụng xử lý mọi lỗi mà hàm của bạn có thể trả về.Các chức năng này áp dụng cho tất cả người dùng trong dự án của bạn, kể cả những người dùng có trong người thuê bao. Firebase Authentication cung cấp thông tin về người dùng cho hàm của bạn, bao gồm cả mọi đối tượng thuê mà họ thuộc về, để bạn có thể phản hồi cho phù hợp.
Việc liên kết một nhà cung cấp danh tính khác với tài khoản sẽ kích hoạt lại mọi hàm
beforeSignIn
đã đăng ký.Xác thực tuỳ chỉnh và ẩn danh không kích hoạt các chức năng chặn.
Triển khai một hàm chặn
Để chèn mã tuỳ chỉnh vào quy trình xác thực người dùng, hãy triển khai các hàm chặn. Sau khi triển khai các hàm chặn, mã tuỳ chỉnh của bạn phải hoàn tất thành công để quá trình xác thực và tạo người dùng diễn ra thành công.
Bạn triển khai một hàm chặn theo cách tương tự như cách bạn triển khai bất kỳ hàm nào. (xem trang Cloud Functions Bắt đầu để biết thông tin chi tiết). Tóm lại:
Viết một hàm xử lý sự kiện được nhắm đến.
Ví dụ: để bắt đầu, bạn có thể thêm một hàm không hoạt động như sau vào
index.js
:const functions = require('firebase-functions/v1'); exports.beforeCreate = functions.auth.user().beforeCreate((user, context) => { // TODO }); The above example has omitted the implementation of custom auth logic. See the following sections to learn how to implement your blocking functions and [Common scenarios](#common-scenarios) for specific examples.
Triển khai các hàm bằng giao diện dòng lệnh Firebase:
firebase deploy --only functions
Bạn phải triển khai lại các hàm mỗi khi cập nhật chúng.
Nhận thông tin người dùng và ngữ cảnh
Các sự kiện beforeSignIn
và beforeCreate
cung cấp các đối tượng User
và EventContext
chứa thông tin về người dùng đăng nhập. Sử dụng các giá trị này trong mã của bạn để xác định xem có cho phép một thao tác tiếp tục hay không.
Để biết danh sách các thuộc tính có trên đối tượng User
, hãy xem tài liệu tham khảo về API UserRecord
.
Đối tượng EventContext
chứa các thuộc tính sau:
Tên | Mô tả | Ví dụ |
---|---|---|
locale |
Ngôn ngữ của ứng dụng. Bạn có thể đặt ngôn ngữ bằng SDK ứng dụng hoặc bằng cách truyền tiêu đề ngôn ngữ trong REST API. | fr hoặc sv-SE |
ipAddress
| Địa chỉ IP của thiết bị mà người dùng cuối đang đăng ký hoặc đăng nhập. | 114.14.200.1 |
userAgent
| Tác nhân người dùng kích hoạt chức năng chặn. | Mozilla/5.0 (X11; Linux x86_64) |
eventId
| Giá trị nhận dạng duy nhất của sự kiện. | rWsyPtolplG2TBFoOkkgyg |
eventType
|
Loại sự kiện. Thông tin này cung cấp thông tin về tên sự kiện, chẳng hạn như beforeSignIn hoặc beforeCreate , và phương thức đăng nhập được liên kết đã dùng, chẳng hạn như Google hoặc email/mật khẩu.
|
providers/cloud.auth/eventTypes/user.beforeSignIn:password
|
authType
| Luôn USER . |
USER
|
resource
| Dự án hoặc đối tượng thuê Firebase Authentication. |
projects/project-id/tenants/tenant-id
|
timestamp
| Thời gian kích hoạt sự kiện, có định dạng là chuỗi RFC 3339. | Tue, 23 Jul 2019 21:10:57 GMT
|
additionalUserInfo
| Một đối tượng chứa thông tin về người dùng. |
AdditionalUserInfo
|
credential
| Một đối tượng chứa thông tin về thông tin đăng nhập của người dùng. |
AuthCredential
|
Chặn hoạt động đăng ký hoặc đăng nhập
Để chặn một lần đăng ký hoặc đăng nhập, hãy gửi một HttpsError
trong hàm của bạn. Ví dụ:
Node.js
throw new functions.auth.HttpsError('permission-denied');
Bảng sau đây liệt kê những lỗi bạn có thể gặp phải, cùng với thông báo lỗi mặc định:
Tên | Mã | Nội dung |
---|---|---|
invalid-argument |
400 |
Ứng dụng khách chỉ định đối số không hợp lệ |
failed-precondition |
400 |
Không thể thực thi yêu cầu trong tình trạng hệ thống hiện tại. |
out-of-range |
400 |
Ứng dụng khách chỉ định phạm vi không hợp lệ. |
unauthenticated |
401 |
Mã thông báo OAuth bị thiếu, không hợp lệ hoặc đã hết hạn. |
permission-denied |
403 |
Ứng dụng khách không có đủ quyền. |
not-found |
404 |
Không tìm thấy tài nguyên được chỉ định. |
aborted |
409 |
Xung đột tình trạng đồng thời, chẳng hạn như xung đột read-modify-write. |
already-exists |
409 |
Tài nguyên mà ứng dụng khách tìm cách tạo đã tồn tại. |
resource-exhausted |
429 |
Hết định mức tài nguyên hoặc đã đạt đến tốc độ giới hạn. |
cancelled |
499 |
Ứng dụng khách đã hủy yêu cầu. |
data-loss |
500 |
Mất hoặc hư hỏng dữ liệu và không phục hồi được. |
unknown |
500 |
Lỗi máy chủ không xác định. |
internal |
500 |
Lỗi máy chủ nội bộ. |
not-implemented |
501 |
Máy chủ không triển khai phương thức API. |
unavailable |
503 |
Không có dịch vụ. |
deadline-exceeded |
504 |
Đã quá hạn chót cho yêu cầu. |
Bạn cũng có thể chỉ định một thông báo lỗi tuỳ chỉnh:
Node.js
throw new functions.auth.HttpsError('permission-denied', 'Unauthorized request origin!');
Ví dụ sau đây cho thấy cách chặn người dùng không thuộc một miền cụ thể đăng ký ứng dụng của bạn:
Node.js
exports.beforeCreate = functions.auth.user().beforeCreate((user, context) => {
// (If the user is authenticating within a tenant context, the tenant ID can be determined from
// user.tenantId or from context.resource, e.g. 'projects/project-id/tenant/tenant-id-1')
// Only users of a specific domain can sign up.
if (user.email.indexOf('@acme.com') === -1) {
throw new functions.auth.HttpsError('invalid-argument', `Unauthorized email "${user.email}"`);
}
});
Bất kể bạn sử dụng thông báo mặc định hay thông báo tuỳ chỉnh, Cloud Functions đều sẽ bao bọc lỗi và trả về lỗi đó cho ứng dụng dưới dạng lỗi nội bộ. Ví dụ:
throw new functions.auth.HttpsError('invalid-argument', `Unauthorized email user@evil.com}`);
Ứng dụng của bạn nên nắm bắt lỗi và xử lý lỗi đó cho phù hợp. Ví dụ:
JavaScript
// Blocking functions can also be triggered in a multi-tenant context before user creation.
// firebase.auth().tenantId = 'tenant-id-1';
firebase.auth().createUserWithEmailAndPassword('johndoe@example.com', 'password')
.then((result) => {
result.user.getIdTokenResult()
})
.then((idTokenResult) => {
console.log(idTokenResult.claim.admin);
})
.catch((error) => {
if (error.code !== 'auth/internal-error' && error.message.indexOf('Cloud Function') !== -1) {
// Display error.
} else {
// Registration succeeds.
}
});
Sửa đổi người dùng
Thay vì chặn một lượt đăng ký hoặc đăng nhập, bạn có thể cho phép thao tác tiếp tục, nhưng sửa đổi đối tượng User
được lưu vào cơ sở dữ liệu của Firebase Authentication và trả về cho ứng dụng.
Để sửa đổi một người dùng, hãy trả về một đối tượng từ trình xử lý sự kiện chứa các trường cần sửa đổi. Bạn có thể sửa đổi các trường sau:
displayName
disabled
emailVerified
photoUrl
customClaims
sessionClaims
(chỉbeforeSignIn
)
Ngoại trừ sessionClaims
, tất cả các trường đã sửa đổi đều được lưu vào cơ sở dữ liệu của Firebase Authentication, tức là các trường này sẽ được đưa vào mã thông báo phản hồi và duy trì giữa các phiên hoạt động của người dùng.
Ví dụ sau đây cho thấy cách đặt tên hiển thị mặc định:
Node.js
exports.beforeCreate = functions.auth.user().beforeCreate((user, context) => {
return {
// If no display name is provided, set it to "Guest".
displayName: user.displayName || 'Guest';
};
});
Nếu bạn đăng ký một trình xử lý sự kiện cho cả beforeCreate
và beforeSignIn
, hãy lưu ý rằng beforeSignIn
sẽ thực thi sau beforeCreate
. Các trường người dùng được cập nhật trong beforeCreate
sẽ xuất hiện trong beforeSignIn
. Nếu bạn đặt một trường khác với sessionClaims
trong cả hai trình xử lý sự kiện, thì giá trị được đặt trong beforeSignIn
sẽ ghi đè giá trị được đặt trong beforeCreate
. Đối với sessionClaims
, các thông tin này chỉ được truyền đến các khai báo mã thông báo của phiên hiện tại, nhưng không được duy trì hoặc lưu trữ trong cơ sở dữ liệu.
Ví dụ: nếu bạn đặt bất kỳ sessionClaims
nào, beforeSignIn
sẽ trả về các sessionClaims
đó cùng với mọi yêu cầu beforeCreate
và các yêu cầu đó sẽ được hợp nhất. Khi được hợp nhất, nếu khoá sessionClaims
khớp với một khoá trong customClaims
, thì customClaims
khớp sẽ bị khoá sessionClaims
ghi đè trong các khai báo mã thông báo. Tuy nhiên, khoá customClaims
bị ghi đè vẫn sẽ được duy trì trong cơ sở dữ liệu cho các yêu cầu sau này.
Dữ liệu và thông tin đăng nhập OAuth được hỗ trợ
Bạn có thể truyền thông tin đăng nhập và dữ liệu OAuth đến các hàm chặn từ nhiều nhà cung cấp danh tính. Bảng sau đây cho biết những thông tin đăng nhập và dữ liệu được hỗ trợ cho từng nhà cung cấp danh tính:
Nhà cung cấp nhận dạng | Mã nhận dạng | Mã truy cập | Thời gian hết hạn | Mã thông báo bí mật | Mã làm mới | Thông báo xác nhận quyền sở hữu khi đăng nhập |
---|---|---|---|---|---|---|
Có | Có | Có | Không | Có | Không | |
Không | Có | Có | Không | Không | Không | |
Không | Có | Không | Có | Không | Không | |
GitHub | Không | Có | Không | Không | Không | Không |
Microsoft | Có | Có | Có | Không | Có | Không |
Không | Có | Có | Không | Không | Không | |
Yahoo | Có | Có | Có | Không | Có | Không |
Apple | Có | Có | Có | Không | Có | Không |
SAML | Không | Không | Không | Không | Không | Có |
OIDC | Có | Có | Có | Không | Có | Có |
Mã làm mới
Để sử dụng mã làm mới trong một hàm chặn, trước tiên, bạn phải chọn hộp đánh dấu trên trang Hàm chặn của bảng điều khiển Firebase.
Mọi nhà cung cấp danh tính sẽ không trả về mã thông báo làm mới khi đăng nhập trực tiếp bằng thông tin đăng nhập OAuth, chẳng hạn như mã thông báo nhận dạng hoặc mã thông báo truy cập. Trong trường hợp này, cùng một thông tin xác thực OAuth phía máy khách sẽ được truyền đến hàm chặn.
Các phần sau đây mô tả từng loại nhà cung cấp danh tính, cũng như thông tin đăng nhập và dữ liệu được hỗ trợ của từng loại.
Nhà cung cấp OIDC chung
Khi người dùng đăng nhập bằng một nhà cung cấp OIDC chung, các thông tin đăng nhập sau đây sẽ được chuyển:
- Mã thông báo nhận dạng: Được cung cấp nếu bạn chọn quy trình
id_token
. - Mã truy cập: Được cung cấp nếu bạn chọn quy trình mã. Xin lưu ý rằng quy trình mã hiện chỉ được hỗ trợ thông qua REST API.
- Mã làm mới: Được cung cấp nếu bạn chọn phạm vi
offline_access
.
Ví dụ:
const provider = new firebase.auth.OAuthProvider('oidc.my-provider');
provider.addScope('offline_access');
firebase.auth().signInWithPopup(provider);
Khi người dùng đăng nhập bằng Google, các thông tin đăng nhập sau đây sẽ được chuyển:
- Mã thông báo nhận dạng
- Mã truy cập
- Mã làm mới: Chỉ được cung cấp nếu bạn yêu cầu các thông số tuỳ chỉnh sau:
access_type=offline
prompt=consent
, nếu người dùng đã đồng ý trước đó và không có phạm vi mới nào được yêu cầu
Ví dụ:
const provider = new firebase.auth.GoogleAuthProvider();
provider.setCustomParameters({
'access_type': 'offline',
'prompt': 'consent'
});
firebase.auth().signInWithPopup(provider);
Tìm hiểu thêm về mã làm mới của Google.
Khi người dùng đăng nhập bằng Facebook, thông tin đăng nhập sau đây sẽ được truyền:
- Mã truy cập: Một mã truy cập được trả về và có thể đổi lấy một mã truy cập khác. Tìm hiểu thêm về các loại mã truy cập mà Facebook hỗ trợ và cách bạn có thể trao đổi các mã này để lấy mã truy cập có thời hạn sử dụng lâu dài.
GitHub
Khi người dùng đăng nhập bằng GitHub, thông tin đăng nhập sau đây sẽ được chuyển:
- Mã truy cập: Không hết hạn trừ phi bị thu hồi.
Microsoft
Khi người dùng đăng nhập bằng Microsoft, các thông tin đăng nhập sau đây sẽ được chuyển:
- Mã thông báo nhận dạng
- Mã truy cập
- Mã làm mới: Được truyền đến hàm chặn nếu bạn chọn phạm vi
offline_access
.
Ví dụ:
const provider = new firebase.auth.OAuthProvider('microsoft.com');
provider.addScope('offline_access');
firebase.auth().signInWithPopup(provider);
Yahoo
Khi người dùng đăng nhập bằng Yahoo, các thông tin đăng nhập sau sẽ được truyền mà không có bất kỳ thông số hoặc phạm vi tuỳ chỉnh nào:
- Mã thông báo nhận dạng
- Mã truy cập
- Mã làm mới
Khi người dùng đăng nhập bằng LinkedIn, thông tin đăng nhập sau đây sẽ được chuyển:
- Mã truy cập
Apple
Khi người dùng đăng nhập bằng Apple, các thông tin đăng nhập sau đây sẽ được truyền mà không có bất kỳ thông số hoặc phạm vi tuỳ chỉnh nào:
- Mã thông báo nhận dạng
- Mã truy cập
- Mã làm mới
Các trường hợp phổ biến
Các ví dụ sau đây minh hoạ một số trường hợp sử dụng phổ biến cho các hàm chặn:
Chỉ cho phép đăng ký từ một miền cụ thể
Ví dụ sau đây cho thấy cách ngăn người dùng không thuộc miền example.com
đăng ký bằng ứng dụng của bạn:
Node.js
exports.beforeCreate = functions.auth.user().beforeCreate((user, context) => {
if (!user.email || user.email.indexOf('@example.com') === -1) {
throw new functions.auth.HttpsError(
'invalid-argument', `Unauthorized email "${user.email}"`);
}
});
Chặn người dùng có email chưa được xác minh đăng ký
Ví dụ sau đây cho thấy cách ngăn người dùng có email chưa xác minh đăng ký bằng ứng dụng của bạn:
Node.js
exports.beforeCreate = functions.auth.user().beforeCreate((user, context) => {
if (user.email && !user.emailVerified) {
throw new functions.auth.HttpsError(
'invalid-argument', `Unverified email "${user.email}"`);
}
});
Yêu cầu xác minh email khi đăng ký
Ví dụ sau đây cho thấy cách yêu cầu người dùng xác minh email sau khi đăng ký:
Node.js
exports.beforeCreate = functions.auth.user().beforeCreate((user, context) => {
const locale = context.locale;
if (user.email && !user.emailVerified) {
// Send custom email verification on sign-up.
return admin.auth().generateEmailVerificationLink(user.email).then((link) => {
return sendCustomVerificationEmail(user.email, link, locale);
});
}
});
exports.beforeSignIn = functions.auth.user().beforeSignIn((user, context) => {
if (user.email && !user.emailVerified) {
throw new functions.auth.HttpsError(
'invalid-argument', `"${user.email}" needs to be verified before access is granted.`);
}
});
Coi một số email của nhà cung cấp danh tính là đã xác minh
Ví dụ sau đây cho thấy cách coi email của người dùng từ một số nhà cung cấp danh tính nhất định là đã xác minh:
Node.js
exports.beforeCreate = functions.auth.user().beforeCreate((user, context) => {
if (user.email && !user.emailVerified && context.eventType.indexOf(':facebook.com') !== -1) {
return {
emailVerified: true,
};
}
});
Chặn hoạt động đăng nhập từ một số địa chỉ IP
Ví dụ sau đây cho biết cách chặn hoạt động đăng nhập từ một số dải địa chỉ IP:
Node.js
exports.beforeSignIn = functions.auth.user().beforeSignIn((user, context) => {
if (isSuspiciousIpAddress(context.ipAddress)) {
throw new functions.auth.HttpsError(
'permission-denied', 'Unauthorized access!');
}
});
Thiết lập các xác nhận quyền sở hữu tuỳ chỉnh và theo phiên
Ví dụ sau đây minh hoạ cách thiết lập các giá trị xác nhận quyền sở hữu tuỳ chỉnh và theo phiên:
Node.js
exports.beforeCreate = functions.auth.user().beforeCreate((user, context) => {
if (context.credential &&
context.credential.providerId === 'saml.my-provider-id') {
return {
// Employee ID does not change so save in persistent claims (stored in
// Auth DB).
customClaims: {
eid: context.credential.claims.employeeid,
},
// Copy role and groups to token claims. These will not be persisted.
sessionClaims: {
role: context.credential.claims.role,
groups: context.credential.claims.groups,
}
}
}
});
Theo dõi địa chỉ IP để giám sát hoạt động đáng ngờ
Bạn có thể ngăn chặn hành vi đánh cắp mã thông báo bằng cách theo dõi địa chỉ IP mà người dùng đăng nhập và so sánh địa chỉ IP đó với địa chỉ IP trong các yêu cầu tiếp theo. Nếu yêu cầu có vẻ đáng ngờ (ví dụ: các IP đến từ các khu vực địa lý khác nhau), bạn có thể yêu cầu người dùng đăng nhập lại.
Sử dụng các xác nhận quyền sở hữu phiên để theo dõi địa chỉ IP mà người dùng đăng nhập:
Node.js
exports.beforeSignIn = functions.auth.user().beforeSignIn((user, context) => { return { sessionClaims: { signInIpAddress: context.ipAddress, }, }; });
Khi người dùng cố gắng truy cập vào những tài nguyên yêu cầu xác thực bằng Firebase Authentication, hãy so sánh địa chỉ IP trong yêu cầu với IP được dùng để đăng nhập:
Node.js
app.post('/getRestrictedData', (req, res) => { // Get the ID token passed. const idToken = req.body.idToken; // Verify the ID token, check if revoked and decode its payload. admin.auth().verifyIdToken(idToken, true).then((claims) => { // Get request IP address const requestIpAddress = req.connection.remoteAddress; // Get sign-in IP address. const signInIpAddress = claims.signInIpAddress; // Check if the request IP address origin is suspicious relative to // the session IP addresses. The current request timestamp and the // auth_time of the ID token can provide additional signals of abuse, // especially if the IP address suddenly changed. If there was a sudden // geographical change in a short period of time, then it will give // stronger signals of possible abuse. if (!isSuspiciousIpAddressChange(signInIpAddress, requestIpAddress)) { // Suspicious IP address change. Require re-authentication. // You can also revoke all user sessions by calling: // admin.auth().revokeRefreshTokens(claims.sub). res.status(401).send({error: 'Unauthorized access. Please login again!'}); } else { // Access is valid. Try to return data. getData(claims).then(data => { res.end(JSON.stringify(data); }, error => { res.status(500).send({ error: 'Server error!' }) }); } }); });
Sàng lọc ảnh của người dùng
Ví dụ sau đây cho thấy cách dọn dẹp ảnh hồ sơ của người dùng:
Node.js
exports.beforeCreate = functions.auth.user().beforeCreate((user, context) => {
if (user.photoURL) {
return isPhotoAppropriate(user.photoURL)
.then((status) => {
if (!status) {
// Sanitize inappropriate photos by replacing them with guest photos.
// Users could also be blocked from sign-up, disabled, etc.
return {
photoUrl: PLACEHOLDER_GUEST_PHOTO_URL,
};
}
});
});
Để tìm hiểu thêm về cách phát hiện và làm sạch hình ảnh, hãy xem tài liệu về Cloud Vision.
Truy cập vào thông tin đăng nhập OAuth của nhà cung cấp danh tính của người dùng
Ví dụ sau đây minh hoạ cách lấy mã làm mới cho người dùng đã đăng nhập bằng Google và sử dụng mã này để gọi API Lịch Google. Mã làm mới được lưu trữ để truy cập khi không có mạng.
Node.js
const {OAuth2Client} = require('google-auth-library');
const {google} = require('googleapis');
// ...
// Initialize Google OAuth client.
const keys = require('./oauth2.keys.json');
const oAuth2Client = new OAuth2Client(
keys.web.client_id,
keys.web.client_secret
);
exports.beforeCreate = functions.auth.user().beforeCreate((user, context) => {
if (context.credential &&
context.credential.providerId === 'google.com') {
// Store the refresh token for later offline use.
// These will only be returned if refresh tokens credentials are included
// (enabled by Cloud console).
return saveUserRefreshToken(
user.uid,
context.credential.refreshToken,
'google.com'
)
.then(() => {
// Blocking the function is not required. The function can resolve while
// this operation continues to run in the background.
return new Promise((resolve, reject) => {
// For this operation to succeed, the appropriate OAuth scope should be requested
// on sign in with Google, client-side. In this case:
// https://www.googleapis.com/auth/calendar
// You can check granted_scopes from within:
// context.additionalUserInfo.profile.granted_scopes (space joined list of scopes).
// Set access token/refresh token.
oAuth2Client.setCredentials({
access_token: context.credential.accessToken,
refresh_token: context.credential.refreshToken,
});
const calendar = google.calendar('v3');
// Setup Onboarding event on user's calendar.
const event = {/** ... */};
calendar.events.insert({
auth: oauth2client,
calendarId: 'primary',
resource: event,
}, (err, event) => {
// Do not fail. This is a best effort approach.
resolve();
});
});
})
}
});
Ghi đè kết quả của reCAPTCHA Enterprise cho thao tác của người dùng
Ví dụ sau đây cho biết cách ghi đè kết quả của reCAPTCHA Enterprise cho các quy trình người dùng được hỗ trợ.
Hãy tham khảo bài viết Bật reCAPTCHA Enterprise để tìm hiểu thêm về cách tích hợp reCAPTCHA Enterprise với Xác thực Firebase.
Bạn có thể dùng các hàm chặn để cho phép hoặc chặn các luồng dựa trên các yếu tố tuỳ chỉnh, từ đó ghi đè kết quả do reCAPTCHA Enterprise cung cấp.
Node.js
const functions = require("firebase-functions/v1");
exports.beforesmsv1 = functions.auth.user().beforeSms((context) => {
if (
context.smsType === "SIGN_IN_OR_SIGN_UP" &&
context.additionalUserInfo.phoneNumber.includes('+91')
) {
return {
recaptchaActionOverride: "ALLOW",
};
}
// Allow users to sign in with recaptcha score greater than 0.5
if (event.additionalUserInfo.recaptchaScore > 0.5) {
return {
recaptchaActionOverride: 'ALLOW',
};
}
// Block all others.
return {
recaptchaActionOverride: 'BLOCK',
}
});