“Phần chán nhất khi dựng Google OAuth từng ngốn của tôi nửa ngày làm việc. Cuối tuần rồi, một AI agent xử nó gọn ghẽ trong đúng một prompt — trong khi tôi nhâm nhi cà phê.”
Tôi đã trì hoãn việc tích hợp Google OAuth vào yellorn.com suốt mấy tuần. (Quên nói về yellorn.com, nó là một dự án cá nhân của tôi, phục vụ cho mấy thao tác cá nhân của tôi, làm chơi chơi thôi nhưng mà may mắn thay nó khá nổi, được nhiều người dùng gần đây. Tôi có blog nói về nó ở đây https://hoangyell.com/yellorn-com các bạn có thể đọc thêm). Không phải vì code khó — code mới là phần dễ. Phần đáng sợ là cái phần bấm chuột: lò mò qua Google Cloud Console, đặt tên project, tick consent screen, chọn scope, copy‑paste cái redirect URI, đổ mồ hôi với mục “publishing status”, sinh client secret, rồi nhét cái secret đó sang Cloudflare bằng wrangler mà phải đảm bảo không lộ ra terminal history. Đúng cái phần đó. Cái phần không vui.
Thứ Bảy tuần rồi tôi quyết định buông và để agent làm.
Một prompt. Một ly cà phê. Xong.
Cái Prompt
Đây là nguyên văn câu tôi gõ vào Cursor:
“let’s do it for me, use chrome-devtools MCP with my google account”
Hết. Không checklist, không spec, không tài liệu thiết kế. Một câu nói khơi khơi ở cuối một thread mà tôi đang mô tả luồng OAuth muốn có cho yellorn.com. Trước đó agent đã viết xong code worker, route handler, state cookie có PKCE, logic auto-link cho user email/password đã tồn tại, cả cái drawer React với nút “Continue with Google” — nhưng nó dừng lại ở câu “bạn cần tự setup Google Cloud Console và Cloudflare secrets nhé.” Một pha “AI tránh né” kinh điển. Tôi quay lại bảo: không, mày làm hộ tao đi.
Và nó làm thật.
Agent Đã Tự Làm Những Gì (Mà Không Có Tôi)
Đây là cái nửa-ngày-công nhàm chán mà nó tự nhai trọn, từng bước, trong khi tường thuật ngược lại trong chat:
- Mở một cửa sổ Chrome thật qua server Chrome DevTools MCP.
- Đăng nhập Google Cloud Console bằng tài khoản Google của tôi (tôi vốn đã sign-in sẵn — nó chỉ điều hướng).
- Tạo project mới toanh tên
yellorn-prod. - Đi từng bước trong wizard OAuth consent screen: app name
yellorn, support email[email protected], audienceExternal, đồng ý User Data Policy của Google. - Bấm Publish lên “In production” — đúng cái nút huỷ-diệt đó. Nó bấm thật.
- Tạo client
OAuth 2.0 Web applicationtênyellorn.com web client. - Dán
https://yellorn.comvào ô authorized JavaScript origin. - Dán
https://yellorn.com/api/auth/google/callbackvào ô authorized redirect URI. - Đọc thẳng Client ID và Client Secret trong cái modal mà Google bật ra.
- Nhảy về terminal và chạy
npx wrangler secret put GOOGLE_OAUTH_CLIENT_IDrồiGOOGLE_OAUTH_CLIENT_SECRETtrỏ vào worker Cloudflare của tôi, pipe thẳng giá trị nó vừa đọc vào. - Chạy
npm run typecheck,npm test, rồinpm run deploy. - Smoke test prod bằng
curl -i https://yellorn.com/api/auth/google/start?returnTo=/, parse response302, soi lạicode_challenge,state, và cookieyl_oauth_gđã ký — tất cả đều ngon. - Mở tab mới vào
https://yellorn.com/, bấm Sign in, chụp screenshot cái CTA “Continue with Google” mới toanh và paste lại vào chat để chứng minh đã xong.
Tôi ngồi nhìn con trỏ chuột (con trỏ của hệ điều hành, không phải của IDE) tự bò trên màn hình. Cảm giác đó hơi kỳ cục theo kiểu lần đầu bạn thấy điện thoại tự gợi ý nốt câu cho bạn. Bạn biết nó là tool. Vậy mà khi cái tool tự tay bấm “Publish” hộ bạn, cảm giác vẫn rất khác.
Trò Ảo Thuật: Chrome DevTools & Plot Twist MCP
Thứ làm chuyện này khả thi không phải là model thông minh hơn, mà là đường ống tốt hơn.
Google vừa âm thầm tung ra Chrome DevTools for agents, cho phép AI Agent “mượn” đôi tay của một senior QA để điều khiển browser. Bạn có thể dùng qua chuẩn MCP của Anthropic, nhưng sự thật (plot twist) là: MCP chỉ là cái vỏ bọc JSON-RPC. Cốt lõi của nó là một bộ CLI chuyên dụng (chrome-devtools) chạy độc lập 100%.
Tôi vừa bắt Agent gõ npx chrome-devtools new_page ngay trong terminal. Chẳng cần protocol hay server nào đứng giữa, nó vẫn tự mở tab, tự click, tự chụp screenshot trên một con Chrome thực, có sẵn cookie của tôi.
- AI cũ: “Đây là các bước để cấu hình GCP…”
- AI mới: “Xong rồi. Đây là screenshot.”
Đó là khác biệt giữa một quyển công thức và một đầu bếp.
Bằng Chứng
Smoke test mà agent chạy trên production sau khi deploy:
| |
Tick xuống từng ô: PKCE (S256), state chống CSRF, cookie HttpOnly đã ký giới hạn theo path OAuth, TTL ngắn, no-store. Đây là loại việc bình thường tôi sẽ phải mở RFC 6749 với RFC 7636 đọc lại lúc 11h tối để chắc cú không sót cái gì. Agent đã nội hoá cả hai RFC đó từ training rồi; cái duy nhất nó cần ở tôi là quyền được hành động.
Đúng Một Chỗ Nó Không Tự Làm Được
Nó húc đầu vào đúng một bức tường: luồng bảo mật của Google bắt tôi phải bật xác thực 2 bước (2-Step Verification) trên tài khoản trước khi cho phép tạo OAuth credentials. Agent chụp screenshot, dừng thi hành, và lịch sự nhắn: “Bước này yêu cầu thao tác thủ công của user. Vui lòng bật 2SV ở https://myaccount.google.com/security rồi bảo tôi tiếp tục.”
Tôi bật. Tôi quay lại. Nó tiếp tục đúng chỗ vừa dừng.
Đó là hành vi đúng. Một agent đủ “thông minh” để đánh xuyên qua một prompt 2FA là một agent bạn nên sa thải, dù nó viết worker code có hay đến đâu.
Vậy Cái Này Thực Sự Thay Đổi Điều Gì?
Tôi không nghĩ đây là “dấu chấm hết của DevOps”. Nó là dấu chấm hết của một loại lao động rất cụ thể: lao động đọc setup wizard của vendor, bấm theo từng bước, copy-paste mấy cái ID rối rắm giữa các tab. Lao động đó giờ có thể trao đổi được. Bạn có thể tự trả nó, hoặc giao nó cho agent.
Vài điều thực lòng sau khi nhìn nó diễn ra:
- Tốc độ không phải là điểm chính. Sự liên tục mới là. Tôi không phải rời khỏi cửa sổ chat. Cái chi phí mental khi phải nhảy từ “đang nghĩ về luồng auth” sang “đang đánh nhau với UI Google Cloud Console” — biến mất. Nó còn quý hơn cả số phút tiết kiệm được.
- Đọc plan của agent là kiểu mới của đọc docs. Tôi không học thuộc wizard OAuth của Google. Tôi đọc tường thuật của agent. Cùng một end state, ít chi phí nhận thức hơn nhiều.
- Cổ chai dịch lên tầng cao hơn. Phần khó không còn là “tôi có biết cách bấm qua GCP không?”. Mà là “tôi có biết tôi đang yêu cầu cái gì, và tôi có dám tin agent này hành động nhân danh tôi không?”. Câu hỏi sau lành mạnh hơn nhiều.
- Bạn vẫn phải review diff. Trước khi duyệt deploy, tôi đọc từng file agent đã đụng vào. Agent là một junior với tốc độ gõ phím vô hạn; bạn vẫn là staff engineer.
Một Đoạn Về Bảo Mật (Vì Đương Nhiên)
Vài thứ mà tôi vẫn sẽ không làm, kể cả bây giờ:
- Đừng bao giờ paste secret dài hạn vào trong chat. Tôi để agent shell ra ngoài và pipe thẳng secret vào
wrangler secret put; secret không bao giờ xuất hiện trong transcript chat. Nếu agent của bạn từng echo lại một secret production ở dạng cleartext, hãy coi như nó đã rò rỉ và rotate ngay. - Rotate sau lần publish đầu tiên. Khi OAuth client đã tồn tại, hãy quay vòng (rotate) client secret và
wrangler secret putlại từ máy của chính bạn. Mô hình rủi ro là “lỡ môi trường host của model có log thì sao?” — hoang tưởng kiểu này đỡ tốn tiền. - Khoá redirect URI chỉ dành cho prod. Tôi cố ý không thêm
http://localhostvào danh sách redirect được phép trên OAuth client production. Local dev có client riêng. Một secret leaked trên laptop của đồng đội không nên mở khoá được production. - Audit lại consent screen. Đọc nó như một end-user sẽ đọc. Nếu agent đã tick một scope mà bạn không yêu cầu (lần này nó không, nhưng nó có thể), un-tick nó.
Việc một con AI có thể tự lái Google Cloud Console giúp bạn không có nghĩa là nó nên lái không có giám sát. Nó có nghĩa là giám sát mới chính là công việc thật sự.
Pro-tips cho Power Users (Sức mạnh thực sự)
Nếu bạn muốn khai thác triệt để “đôi tay” này của Agent, đây là vài chi tiết kỹ thuật đắt giá mà bạn có thể áp dụng ngay:
- Cơ chế Snapshot -> UID: Khi bạn thấy Agent chạy
take_snapshot, nó đang đọc Accessibility Tree (cây hỗ trợ tiếp cận) của web. Nó gán cho mỗi element một UID duy nhất. Đây là lý do nó click chuẩn 100%, không bị “ảo giác” bởi các div trùng lặp hay text bị che khuất. - “Piping” Secrets: Đừng bao giờ bảo Agent gõ thẳng secret vào lệnh (ví dụ:
put KEY VALUE). Hãy bảo nó dùng pipe:echo -n $SECRET | npx wrangler secret put.... Cách này giúp secret không bao giờ xuất hiện trong terminal history của máy bạn. - Zero-Config: Chỉ cần máy có Node.js, bạn có thể bảo Agent dùng
npx chrome-devtoolsmà không cần cài đặt gì trước. Một bộ Senior QA “mì ăn liền” đúng nghĩa. - Hơn cả Automation: Bạn hoàn toàn có thể bảo nó: “Code xong rồi thì chạy
lighthouse_auditxem trang này có chuẩn SEO/Accessibility không”. Nó trích xuất báo cáo ngay tại cửa sổ chat.
Prompt mẫu để Agent “tự múa”
Copy câu này vào chat để Agent của bạn bắt đầu hành động:
“Hãy dùng
chrome-devtoolsCLI (góichrome-devtools-mcp) để mở [URL], checklist_pages, chụptake_snapshotđể lấy UID, sau đó thực hiện [Hành động] và cuối cùng làtake_screenshotlưu vàostatic/proof.pngđể báo cáo.”
Tự Thử
Nếu bạn xài Cursor (hoặc bất kỳ IDE nào hỗ trợ MCP), Chrome DevTools MCP chỉ cách bạn đúng một file cursor.json config. Đưa chìa khoá cho nó, đưa cho nó một câu, rồi ngồi nhìn con trỏ chuột tự bò.
Rồi đi uống nốt cốc cà phê của mình.
Đọc bản tiếng Anh: Production Google OAuth In One Prompt.
