Featured image of post Set Up Google OAuth Production Bằng Đúng 1 Prompt: Khi Tôi Để Cursor Tự Bấm Qua Google Cloud Console

Set Up Google OAuth Production Bằng Đúng 1 Prompt: Khi Tôi Để Cursor Tự Bấm Qua Google Cloud Console

Tôi nhờ một AI agent dựng Google OAuth chuẩn production cho yellorn.com. Đúng một prompt sau, nó đã tự bấm qua Google Cloud Console, dựng consent screen, tạo OAuth client, đẩy secret lên Cloudflare và deploy lên prod. Tôi chỉ ngồi nhâm nhi cà phê.

“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:

  1. Mở một cửa sổ Chrome thật qua server Chrome DevTools MCP.
  2. Đă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).
  3. Tạo project mới toanh tên yellorn-prod.
  4. Đi từng bước trong wizard OAuth consent screen: app name yellorn, support email [email protected], audience External, đồng ý User Data Policy của Google.
  5. Bấm Publish lên “In production” — đúng cái nút huỷ-diệt đó. Nó bấm thật.
  6. Tạo client OAuth 2.0 Web application tên yellorn.com web client.
  7. Dán https://yellorn.com vào ô authorized JavaScript origin.
  8. Dán https://yellorn.com/api/auth/google/callback vào ô authorized redirect URI.
  9. Đọc thẳng Client IDClient Secret trong cái modal mà Google bật ra.
  10. Nhảy về terminal và chạy npx wrangler secret put GOOGLE_OAUTH_CLIENT_ID rồi GOOGLE_OAUTH_CLIENT_SECRET trỏ vào worker Cloudflare của tôi, pipe thẳng giá trị nó vừa đọc vào.
  11. Chạy npm run typecheck, npm test, rồi npm run deploy.
  12. Smoke test prod bằng curl -i https://yellorn.com/api/auth/google/start?returnTo=/, parse response 302, soi lại code_challenge, state, và cookie yl_oauth_g đã ký — tất cả đều ngon.
  13. 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:

1
2
3
4
5
$ curl -sSI 'https://yellorn.com/api/auth/google/start?returnTo=/'
HTTP/2 302
location: https://accounts.google.com/o/oauth2/v2/auth?client_id=...&response_type=code&scope=openid+email+profile&redirect_uri=https%3A%2F%2Fyellorn.com%2Fapi%2Fauth%2Fgoogle%2Fcallback&state=...&code_challenge=...&code_challenge_method=S256&access_type=online&prompt=select_account
set-cookie: yl_oauth_g=...; Path=/api/auth/google/; Secure; HttpOnly; SameSite=Lax; Max-Age=600
cache-control: no-store

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ờ:

  1. Đừ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.
  2. 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 put lạ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.
  3. Khoá redirect URI chỉ dành cho prod. Tôi cố ý không thêm http://localhost và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.
  4. 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:

  1. 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.
  2. “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.
  3. Zero-Config: Chỉ cần máy có Node.js, bạn có thể bảo Agent dùng npx chrome-devtools mà không cần cài đặt gì trước. Một bộ Senior QA “mì ăn liền” đúng nghĩa.
  4. Hơn cả Automation: Bạn hoàn toàn có thể bảo nó: “Code xong rồi thì chạy lighthouse_audit xem 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-devtools CLI (gói chrome-devtools-mcp) để mở [URL], check list_pages, chụp take_snapshot để lấy UID, sau đó thực hiện [Hành động] và cuối cùng là take_screenshot lưu vào static/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.

Được tạo với sự lười biếng tình yêu 🦥

Subscribe to My Newsletter