2013-12-12 21 views
8

Khi tôi buộc người dùng cấp lại đơn đăng ký lần thứ hai, sử dụng approval_prompt=force, làm cách nào để Google hiển thị cho người dùng toàn bộ danh sách quyền mà ứng dụng của tôi yêu cầu?Ủy quyền cấp lại Google OAuth2 thiếu quyền trên trang chấp thuận

chi tiết:

Tôi có một ứng dụng web mà yêu cầu một tập các điều khoản của Google API, bao gồm access_type=offline. Lần đầu tiên tôi chấp nhận nó, nó cho thấy các trang có sự đồng ý đúng, liệt kê tất cả các quyền, trông giống như:

first time Google OAuth2 consent page

Sau đó, tôi gửi cho người dùng trở lại ủy quyền với Google, với các thông số tương tự. Lần thứ hai, nó chỉ cho thấy "Có quyền truy cập ẩn":

enter image description here

Tại sao nó không hiển thị cho người sử dụng tất cả các quyền? Có cách nào để buộc người dùng yêu cầu tất cả các quyền trong lần thứ hai không? Tại sao hiện tại hiển thị "Có quyền truy cập ngoại tuyến" lần đầu tiên?

Người dùng của chúng tôi cảm thấy khó hiểu rằng ứng dụng của chúng tôi không yêu cầu bất kỳ quyền thực sự nào, vì vậy tôi chỉ muốn hiển thị lại màn hình phê duyệt đầu tiên.

Thông số đầy đủ cho yêu cầu mà tôi đang thực hiện như sau. URL:

https://accounts.google.com/o/oauth2/auth?access_type=offline&approval_prompt=force&client_id=1039955146864.apps.googleusercontent.com&redirect_uri=http://localhost:8081/sync/google/callback&response_type=code&scope=openid%20email%20https://www.googleapis.com/auth/admin.directory.group.readonly%20https://www.googleapis.com/auth/admin.directory.group.member.readonly%20https://www.googleapis.com/auth/admin.directory.user.readonly&state=480704597031619284232891277399900450622 

thông số nổ ra:

access_type:offline 
approval_prompt:force 
client_id:1039955146864.apps.googleusercontent.com 
redirect_uri:http://localhost:8081/sync/google/callback 
response_type:code 
scope:openid email https://www.googleapis.com/auth/admin.directory.group.readonly https://www.googleapis.com/auth/admin.directory.group.member.readonly https://www.googleapis.com/auth/admin.directory.user.readonly 
state:480704597031619284232891277399900450622 
+0

Chúng tôi đang gặp vấn đề tương tự. Bạn đã tìm ra bất cứ điều gì chưa? –

Trả lời

8

Chúng tôi ra mắt gia tăng auth và đây là làm việc như thiết kế.

http://googleplusplatform.blogspot.com/2013/12/google-sign-in-improvements11.html

Ý tưởng là nếu người dùng đã cấp quyền truy cập vào một ứng dụng, không có nhu cầu để hiển thị các điều khoản tương tự và yêu cầu người dùng chấp nhận.

Nếu bạn viết đơn đăng ký của mình đúng thì tình huống này sẽ không phát sinh. Nếu bạn yêu cầu mã ngoại tuyến (mã thông báo làm mới) và lưu trữ nó trên chương trình phụ trợ của mình, bạn không nên yêu cầu lại mã này trừ khi bạn cần nhận một số phạm vi/quyền mới. Bạn nên sử dụng mã thông báo làm mới mà bạn đã lưu trữ trong tương lai. Nếu bạn chỉ cần mã thông báo truy cập khi người dùng ở trên trang web của bạn, bạn có thể sử dụng các luồng khác để yêu cầu mã thông báo truy cập mà không cần người dùng xem trang phê duyệt.

+0

Cảm ơn bạn đã giải thích. Có vẻ hợp lý, mặc dù không phải những gì tôi mong đợi với "approval_prompt = force" (Tôi đoán tôi đã dự kiến ​​nó sẽ yêu cầu TẤT CẢ quyền lại). Tôi sẽ sửa ứng dụng của mình để làm một việc khác. –

+1

"Nếu bạn viết ứng dụng của mình đúng thì tình huống này không phát sinh" ... Làm cách nào chúng tôi có thể xử lý trường hợp chúng tôi nhận được mã thông báo làm mới nhưng sau đó có lỗi khiến nó không thể lưu được? Chúng tôi buộc phải cho người dùng thấy một sự cho phép khó hiểu "có quyền truy cập ngoại tuyến" khi chúng tôi thử lại. –

+0

Vâng, đó là một tình huống mà chúng ta cần phải làm tốt hơn và hiển thị một trang có ý nghĩa hơn. Chúng tôi đang xem xét a) hiển thị lại tất cả các phạm vi b) hiển thị thông báo và yêu cầu người dùng chỉ xác nhận tài khoản họ đang cố sử dụng để đăng nhập. ví dụ: "Chọn tài khoản bạn muốn sử dụng để đăng nhập vào ứng dụng này". Điều này có thể xử lý các tình huống mà người dùng đăng nhập vào nhiều tài khoản và có thể muốn đăng nhập bằng một tài khoản khác. – nvnagr

0

Bạn phải thu hồi mã thông báo truy cập và đăng xuất. Sau đó, nếu bạn đi vào quá trình đăng nhập, nó sẽ hiển thị sự cho phép.

public static void RevokeAcess(String accessOrRefreshToken) throws ClientProtocolException, IOException 
{ 
    HttpClient client = new DefaultHttpClient(); 
    HttpPost post = new HttpPost("https://accounts.google.com/o/oauth2/revoke?token="+accessOrRefreshToken); 
    client.execute(post); 
} 

quá trình Mạng lưới này nên được gọi là trong chủ đề ui phi hoặc asyntask

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