Di chuyển từ ClientLogin sang OAuth 2.0

Ikai Lan, YouTube Developer Relations – June 2013

API YouTube sử dụng OAuth 2.0 để cho phép yêu cầu của người dùng. Chúng tôi thường được hỏi xem chúng tôi sẽ thêm hỗ trợ cho việc xác thực ClientLogin hay tương tự trong các API YouTube sau này. Tuy nhiên, chúng tôi đã chính thức ngừng sử dụng ClientLogin kể từ ngày 20 tháng 4 năm 2012 và không có kế hoạch thêm cơ chế như vậy.

Có nhiều lý do khiến chúng tôi tin rằng việc hỗ trợ nhiều quy trình uỷ quyền OAuth 2.0 sẽ phù hợp hơn cho người dùng YouTube so với ClientLogin. Các quy trình này hỗ trợ trường hợp sử dụng cho ứng dụng dành cho máy tính, ứng dụng chỉ dành cho web, ứng dụng gốc dành cho thiết bị di động và thậm chí là ứng dụng chạy trên các thiết bị như TV không có cơ chế đầu vào phức tạp – một điều khó thực hiện được bằng ClientLogin. Ngoài ra, chúng tôi cũng nhận thấy ClientLogin khiến nhiều nhà phát triển khó chịu hơn sau khi phát hành, một số trong đó chúng tôi mô tả trong bài đăng trên blog của mình là ClientLogin #FAIL.

Sử dụng OAuth 2.0 cho tập lệnh độc lập phía máy chủ

Nhiều nhà phát triển sử dụng ClientLogin để cho phép tập lệnh dòng lệnh chạy trên máy chủ mà không cần trình duyệt. Với OAuth 2.0, hầu như sẽ luôn có trình duyệt liên quan – ngoại lệ là khi bạn đang làm việc trên ứng dụng Android sử dụng Google Play Services để tìm nạp mã thông báo qua GoogleAuthUtil.

Trong quy trình chỉ web, trang web muốn thay mặt người dùng thực hiện lệnh gọi API được xác thực phải chuyển hướng người dùng đến trang xác thực google.com nhằm giải thích những gì ứng dụng đang cố gắng truy cập. Sau đó, ứng dụng web sẽ nhận được một mã thông báo dùng để thực hiện lệnh gọi API. Sau đó, người dùng có thể thu hồi quyền truy cập của ứng dụng bất kỳ lúc nào bằng cách sử dụng trang connected apps and sites.

Mẫu mã Python của chúng tôi minh họa cách tập lệnh dòng lệnh có thể chạy trình duyệt và thực hiện lệnh gọi API từ cửa sổ dòng lệnh, tạo máy chủ cục bộ để nghe mã sau khi chuyển hướng ủy quyền và tự động lưu mã thông báo cho các lệnh gọi API trong tương lai. Dưới đây là video về cách thực hiện:

Mã thông báo được sử dụng là chuỗi ASCII. Nếu đó là mã thông báo offline thì mã đó là cổng di động. Khi sử dụng mã thông báo được truy xuất, bạn có thể chạy tập lệnh trên máy tính để bàn, sau đó sao chép và sử dụng mã trên máy chủ từ xa mà không cần GUI, miễn là mã đó tạo bản sao ứng dụng khách OAuth 2.0 có cùng ID và ID ứng dụng khách. Ngoài Python, thư viện ứng dụng Google API cho các ngôn ngữ lập trình khác cũng cung cấp phương thức trợ giúp để quản lý mã thông báo. Bạn có thể chia sẻ phương thức này giữa các ứng dụng và thậm chí dùng trong các thư viện HTTP cấp thấp hơn ngay trong tiêu đề ứng dụng hoặc dưới dạng tham số URL.

Một số ví dụ về tập lệnh phía máy chủ sử dụng mã thông báo ngoại tuyến:

  • daemon theo dõi thư mục để tự động tải video mới lên YouTube
  • Dịch vụ cron cập nhật danh sách phát hàng ngày bằng nội dung mới
  • Tập lệnh giám sát dữ liệu video thông qua API YouTube Analytics và thông báo cho người quản lý kênh khi diễn ra một số sự kiện nhất định, chẳng hạn như tổng thời gian xem vượt quá giới hạn. Lưu ý rằng trong trường hợp này, OAuth 2.0 là phương thức uỷ quyền duy nhất được hỗ trợ vì API Analytics không hỗ trợ ClientLogin.

Phần về mã truy cập dài hạn cung cấp thêm thông tin về cách tạo mã thông báo ngoại tuyến có thể dùng cho quy trình phía máy chủ.

ID ứng dụng khách và phương pháp hay nhất về mật khẩu ứng dụng khách

Mọi mã có chung mã ứng dụng khách và cặp khóa bí mật đều có thể sử dụng cùng một mã truy cập. Tốt nhất là bạn nên hạn chế quyền truy cập vào mã ứng dụng khách và mật khẩu ứng dụng khách để mã chạy trên các máy và thiết bị trong tổ chức của bạn.

Không đưa mã ứng dụng khách và mật khẩu ứng dụng khách vào mã ứng dụng di động gốc của bạn. Tất cả nhà phát triển thực hiện xác thực OAuth 2.0 từ thiết bị di động phải sử dụng ID ứng dụng khách "Ứng dụng đã cài đặt". ID này yêu cầu thêm thông tin để xác minh rằng yêu cầu chỉ đến từ một ứng dụng được nhóm của bạn phát hành.

Trên thiết bị Android, thay vì sử dụng mã ứng dụng khách và mật khẩu ứng dụng khách, ứng dụng của bạn được xác định bằng cách kết hợp tên gói và hàm băm chứng chỉ ký. Trên thiết bị iOS, các mã nhận dạng gói và mã cửa hàng ứng dụng được sử dụng. Bạn có thể xem tài liệu chính thức về cách truy xuất thông tin này trên trang trợ giúp của Google API Console.

Tài khoản dịch vụ không hoạt động với API YouTube

Tài khoản dịch vụ không hoạt động đối với các lệnh gọi API Dữ liệu YouTube vì các tài khoản dịch vụ cần có một kênh YouTube liên kết và bạn không thể liên kết kênh mới hoặc kênh hiện có với tài khoản dịch vụ. Nếu bạn sử dụng tài khoản dịch vụ để gọi API Dữ liệu YouTube, thì máy chủ API sẽ trả về lỗi với loại lỗi được đặt thành unauthorized và lý do được đặt thành youtubeSignupRequired.

Quyền truy cập ngoại tuyến/dài hạn vào API YouTube

OAuth 2.0 có mã thông báo ngắn hạn và mã thông báo dài hạn. Đối với các thao tác một lần, bạn nên sử dụng mã truy cập ngắn hạn. Những mã thông báo này sẽ hết hạn ngay sau khi được cấp. Đối với các công việc chạy trong thời gian dài, bạn nên xem xét việc lấy mã làm mới (được dùng để tìm nạp mã truy cập ngắn hạn).

Để đảm bảo rằng ứng dụng của bạn nhận được mã thông báo làm mới dài hạn chứ không phải mã truy cập ngắn hạn, hãy sử dụng luồng "Ứng dụng đã cài đặt" khi tạo mã ứng dụng rồi chọn Other cho giá trị "Loại ứng dụng đã cài đặt":

Bạn nên sử dụng quy trình "Ứng dụng đã cài đặt" cho trường hợp sử dụng này. Nếu cần quyền truy cập lâu dài vào API YouTube trong một ứng dụng web, bạn có thể truy xuất API này bằng cách đặt tham số access_type thành offline và tham số approval_prompt thành force trong yêu cầu uỷ quyền ban đầu hoặc cấu hình ứng dụng của bạn. Một số thư viện ứng dụng sẽ quản lý việc tìm nạp và làm mới mã thông báo truy cập. Nếu bạn muốn viết mã uỷ quyền tuỳ chỉnh của riêng mình, chúng tôi đã phát hành một bài đăng trên blog trên Google Code mà bạn có thể dùng làm cơ sở cho mã của mình.

Sử dụng OAuth 2.0 với điện thoại, máy tính bảng và các thiết bị khác

Khi viết ứng dụng Android, nhà phát triển có thể tận dụng Google Play services để xử lý thông tin uỷ quyền. Dịch vụ Google Play cung cấp quy trình uỷ quyền tiêu chuẩn cho tất cả các API của Google, bao gồm cả các API cho nền tảng YouTube. Phương pháp này sẽ mang lại trải nghiệm vượt trội hơn nhiều cho người dùng ứng dụng Android của bạn so với phương thức xác thực tuỳ chỉnh bằng ClientLogin.

Trên thiết bị iOS, Google cung cấp 2 lựa chọn:

  • Google+ Platform for iOS, tích hợp tính năng đăng nhập cho các sản phẩm của Google và cũng bật các tính năng xã hội
  • gtm-oauth2 toolkit, cung cấp UIWebView ủy quyền và quản lý mã thông báo

Đối với các thiết bị hoạt động như thiết bị "màn hình thứ hai" hoặc thiết bị như TV không có cơ chế nhập liệu dễ sử dụng, OAuth 2.0 cho thiết bị là phương pháp ưu tiên. OAuth 2.0 cho thiết bị hoạt động bằng cách hiển thị mã duy nhất cho người dùng khi yêu cầu uỷ quyền. Tại thời điểm này, người dùng được yêu cầu duyệt đến http://google.com/device trên một thiết bị khác, chẳng hạn như máy tính xách tay hoặc điện thoại và nhập mã duy nhất đó. Ứng dụng hiển thị một màn hình giống như sau:

Trong khi người dùng đang nhập mã trên một thiết bị khác, ứng dụng sẽ thăm dò ý kiến định kỳ để xem mã đã được nhập hay chưa. Sau khi có sẵn, API này sẽ truy xuất mã thông báo để thực hiện lệnh gọi API. Để xem tính năng này trong thực tế, hãy xem bản minh họa, bạn có thể chạy bản minh hoạ này trên mọi thiết bị có hỗ trợ web. Bản thân API này không tương thích với nền tảng, giúp nó hữu ích đối với các thiết bị không có tính năng hiển thị trên web. Chúng tôi đã đăng mã mẫu trong Python để sử dụng làm bản minh hoạ.

Tóm tắt

Quy trình uỷ quyền OAuth 2.0 giúp các nhà phát triển cần được uỷ quyền trên YouTube một cách linh hoạt. Các nhà phát triển quen thuộc với ClientLogin có thể thấy rằng việc thiết lập ứng dụng để sử dụng OAuth 2.0 cần nhiều công sức hơn để bắt đầu. Tuy nhiên, sau khi chuyển, ứng dụng OAuth 2.0 sẽ linh hoạt hơn, an toàn hơn và dễ sử dụng trên nhiều nền tảng cho người dùng cuối.

Nếu bạn có thắc mắc khác về OAuth 2.0 hoặc bất kỳ ví dụ nào trong bài viết này, vui lòng đặt câu hỏi bằng thẻ youtube-api trên Stack Overflow.