2012-05-09 33 views
22

Với google openid cũ, khi tôi gửi người dùng (trước đây đã chọn tham gia ứng dụng của tôi) đến url xác thực, nó sẽ ngay lập tức chuyển hướng chúng trở lại ứng dụng của tôi.Tại sao Google OAuth2 lại yêu cầu người dùng cấp quyền khi tôi gửi lại URL xác thực

Bây giờ, với OAuth2, url xác thực sẽ yêu cầu người dùng cấp quyền. Tôi đọc một số tài liệu về vấn đề này, nhưng những gì tôi không nhận được là như thế nào dòng này tôi phải làm việc:

  1. bản ghi tài khoản vào google thông qua ứng dụng của tôi và nhấp chuột PHÉP cho phép
  2. Vài ngày sau đó, cookie bị xóa , người dùng quay trở lại trang web của tôi, nhấp chuột "đăng nhập vào google"
  3. người dùng không được xin phép một lần nữa và họ ngay lập tức đăng nhập.

tôi nghĩ rằng nó có cái gì để làm với lưu trữ các auth token hoặc mã thông báo làm mới ở bước 1, nhưng trong Bước 3, tôi không biết họ là ai vậy, làm cách nào để tôi có thể đối sánh chúng với mã xác thực hoặc mã thông báo làm mới thích hợp để nhận mã thông báo truy cập hợp lệ.

Trong các thử nghiệm của mình, khi tôi gửi chúng đến url xác thực ban đầu ở bước 1, chúng được yêu cầu quyền lại.

EDIT: Tìm thấy giải pháp

Các google-api đặt "approval_prompt = lực" theo mặc định khi tạo url auth.

Trả lời

23

Có như bạn đã lưu ý khi sử dụng tham số URL approval_prompt = force sẽ buộc hiển thị hộp thoại xác thực cho người dùng mỗi lần. Bằng cách xóa tham số URL này, người dùng sẽ không được nhắc về các luồng auth tiếp theo.

Có một sự khác biệt nhỏ trong phản hồi mà bạn sẽ nhận được nếu bạn sử dụng luồng phía máy chủ (response_type = code) và truy cập ngoại tuyến (access_type = offline). Lần đầu tiên người dùng ủy quyền cho bạn (khi anh ta nhìn thấy màn hình phê duyệt) hoặc nếu bạn ép buộc điều này bằng cách sử dụng approval_prompt = force thì khi bạn trao đổi mã auth, bạn sẽ được cấp một tệp refresh_token và một access_token.

Tuy nhiên mỗi khi người dùng không được hiển thị với màn hình phê duyệt (auth tiếp theo khi không sử dụng approval_prompt = force), khi trao đổi mã auth, bạn sẽ chỉ được cấp access_token, no refresh_token. Vì vậy, nếu đó là luồng bạn đang sử dụng và nếu bạn muốn có thể truy cập dữ liệu của người dùng ngoại tuyến, bạn cần phải đảm bảo rằng bạn lưu refresh_token cục bộ để sử dụng trong tương lai, khi bạn nhận được nó lần đầu tiên. Điều đó chỉ có khả năng xảy ra nếu bạn yêu cầu quyền truy cập vào loại dữ liệu khác đơn giản là dữ liệu auth (sử dụng luồng OAuth 2, bạn có thể yêu cầu quyền truy cập vào dữ liệu khác chẳng hạn như dữ liệu API Danh bạ, dữ liệu API lịch, Dữ liệu Drive, v.v ...) thường là luồng Open ID thông thường sẽ không cần truy cập ngoại tuyến.

+3

tôi đã đặt cài đặt này thành 'tự động' làm tài liệu google cho biết. Nhưng thật đáng buồn nó luôn luôn yêu cầu một lần nữa cho phép. – dyoser

+1

Hi dyoser, tôi gặp vấn đề tương tự. Bạn có cơ hội để sửa lỗi này không? – javadev

+0

Bạn phải hoàn tất quy trình bằng cách trao đổi mã cho mã thông báo sau đó ứng dụng sẽ xuất hiện trong danh sách tại đây https://security.google.com/settings/security/permissions và người dùng sẽ không được yêu cầu quyền lại. – zavr

0

Chỉ cần chuyển một tham số bổ sung trong yêu cầu 'approval_prompt=auto' đã hoạt động đối với tôi.

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