21

Tôi đã có ứng dụng hỗ trợ Google Drive hiện có đang sử dụng thư viện máy khách Google Java và auth dòng máy chủ.Có thể chọn đúng bất kỳ tài khoản Google nào có sẵn để sử dụng khi sử dụng ủy quyền thông qua thư viện máy khách JS cho Drive không?

Nếu bạn chưa đăng nhập vào ứng dụng và điều hướng đến URL VÀ bạn đã đăng nhập vào nhiều tài khoản Google trên trình duyệt đó (chỉ có một tài khoản Google cá nhân, bất kỳ tài khoản bổ sung nào phải là tài khoản Google) cuộc gọi lại OAuth cung cấp các tùy chọn để chọn Tài khoản Google nào sẽ sử dụng.

Tuy nhiên, trong khi thử nghiệm một chuyển đổi để sử dụng thư viện máy khách JavaScript tôi không thể kích hoạt màn hình chọn nhiều tài khoản bằng cách sử dụng gapi.auth.authorize. Có thể xử lý nhiều tài khoản bằng cách sử dụng thư viện JS không?

Cập nhật: Tôi đã thử với thông số immediatefalse. Tôi có thể đăng nhập miễn là tôi không thay đổi tài khoản trong cửa sổ bật lên. Nếu tôi làm thay đổi tài khoản, tôi nhận được để:

https://accounts.google.com/o/oauth2/auth?client_id=433863057149.apps.googleusercontent.com&scope=https://www.googleapis.com/auth/drive.file+https://www.googleapis.com/auth/drive.install+https://www.googleapis.com/auth/userinfo.email+https://www.googleapis.com/auth/userinfo.profile&immediate=false&redirect_uri=postmessage&origin=https://drivedrawio.appspot.com&proxy=oauth2relay593063763&response_type=token&state=701344514&authuser=1

trong một tab mới và không có gì xảy ra. Tôi đã made a video to demonstrate.

Cập nhật 2: This bug đối với thư viện máy khách JS cho nhu cầu chọn đôi tài khoản mulitple đã được chấp nhận.

Trả lời

42

Bạn không nhận được màn hình lựa chọn đa người dùng vì thông số sau: authuser=0 Thao tác này sẽ tự động chọn tài khoản đầu tiên bạn đăng nhập với (authuser=1 sẽ chọn lần thứ hai v.v.). Hiện tại, không thể loại bỏ tham số đó bằng thư viện khách vì thư viện khách đặt nó tự động thành 0 (đây là lý do tại sao nó không xử lý nhiều tài khoản) nếu không có giá trị như vậy một cách là ghi đè lên nó tới -1 chẳng hạn, điều này sẽ hiển thị trình chọn nhiều tài khoản. Sau đó, bạn cũng có thể yêu cầu truy cập vào số user's profile or email cùng một lúc bạn yêu cầu quyền truy cập vào các API khác và tìm nạp email của người dùng hoặc ID của người dùng đó. Sau đó, trên auth tiếp theo bạn có thể chỉ định các thông số user_id mà wil bỏ qua màn hình lựa chọn người dùng.

Vì vậy, trong thực tế, lần đầu tiên cho phép như thế này:

gapi.auth.authorize({client_id: <Your Client ID>, 
        scope: 'https://www.googleapis.com/auth/drive openid', // That requires access to Google Drive and to the UserInfo API 
        authuser: -1}); 

Vấn đề duy nhất với các bên trên là tự động làm mới của thư viện khách hàng sẽ không làm việc vì mỗi auth sẽ bởi phong toả tại các tài khoản đa màn hình lựa chọn.

Bí quyết là để có được ID của người sử dụng bằng cách sử dụng API UserInfo, lưu ID đó trong một session cookie và sử dụng nó trên auth tiếp theo như thế:

gapi.auth.authorize({client_id: <Your Client ID>, 
        scope: 'https://www.googleapis.com/auth/drive openid', 
        user_id: <The User ID>, 
        authuser: -1}); 

Xác định ID người dùng sẽ đảm bảo trình chọn nhiều tài khoản bỏ qua và sẽ cho phép tự động làm mới mã thông báo từ lib ứng dụng khách để hoạt động lại.

Để tham khảo, param URL khác mà ảnh hưởng đến dòng chảy tài khoản là:

  • user_id: tương tự hơn authuser (bỏ qua màn hình lựa chọn đa tài khoản) nhưng bạn có thể sử dụng địa chỉ email (ví dụ [email protected]) hoặc ID người dùng bạn nhận được từ điểm kết nối ID ID mở của chúng tôi/API Google +/UserInfo API
  • approval_prompt: mặc định là auto, có thể được đặt thành force để đảm bảo màn hình phê duyệt/cấp quyền được hiển thị. Điều này đảm bảo rằng màn hình gant không bị bỏ qua trên auth tiếp theo (sau lần đầu tiên).
  • immediate: immediate hơi phức tạp, khi được đặt thành true nó sẽ bỏ qua màn hình cấp tài khoản (loại approval_prompt=auto) nếu người dùng đã được phê duyệt trước đó, nhưng nếu người dùng chưa được phê duyệt trước đó, bạn sẽ bị chuyển hướng với lỗi : error=immediate_failed. Nếu được đặt thành false, nó sẽ không thêm hành vi đặc biệt và do đó dự phòng trên thiết lập hành vi theo giá trị approval_prompt.

Lưu ý: immediate=trueapproval_prompt=force là kết hợp không hợp lệ.

Tôi nghĩ rằng thư viện khách hàng đang sử dụng immediate param để nếu ông nhận được error=immediate_failed nó sẽ khởi động lại một dòng chảy auth mà không authuser param, nhưng đó là chỉ suy đoán :)

+0

Trong khi đó, bạn đã trả lời kỹ thuật câu hỏi "Làm cách nào để nhận được lời nhắc cho tài khoản Google nào sử dụng thư viện máy khách JS cho Drive?", Câu hỏi của tôi thực sự bị đặt tên sai, xin lỗi :). – David

+0

Tôi vừa trả lời điều này vì tôi biết rõ hơn cách các điểm cuối OAuth hoạt động như thế nào so với thư viện JS Client: D Tôi không biết nó không hoạt động với các tài khoản đa người dùng:/ – Nivco

+0

Bạn tìm thông số này ở đâu? không thể tìm thấy nó trong https://developers.google.com/+/web/api/javascript – chulian

3

Trang truy cập cấp OAuth chỉ được hiển thị khi không ở chế độ ngay lập tức, nó có hoạt động như mong đợi nếu bạn đặt tham số immediate thành false không?

+0

Điều đó tạo ra trang truy cập tài trợ nhưng không tạo ra màn hình lựa chọn tài khoản phải đứng trước nó. –

0

Chú ý đến thông số authuser. Đặt ví dụ này thành "2" và bạn sẽ được nhắc đăng nhập ngay cả khi bạn đã được xác thực.

Các vấn đề liên quan