2013-07-30 41 views
7

Tôi gặp khó khăn khi sử dụng SDK quản trị mới của Google. Cụ thể là API thư mục sử dụng Oauth2. Tôi nghĩ rằng tôi gần như có nhưng tôi đã bị mắc kẹt cố gắng truy xuất chi tiết người dùng bằng API thư mục (Tôi đang sử dụng miền Google Education Edition).API quản trị của Google bằng Oauth2 cho Tài khoản dịch vụ (Education Edition) - Lỗi 403

Về cơ bản những gì tôi đang cố gắng làm là viết một tập lệnh python quy định hoặc de-quy định người dùng dựa trên trạng thái đăng ký của họ được quản lý bởi AD của chúng tôi. Tôi đã có một kịch bản thực hiện điều này bằng cách sử dụng Oauth1 nhưng muốn cập nhật nó để sử dụng Oauth2.

Dưới đây là đoạn mã dựa trên một số ví dụ tôi đã tìm thấy.

f = file('test_key.p12', 'rb') 
key = f.read() 
f.close() 
credentials = SignedJwtAssertionCredentials(
    '[email protected]', 
    key, 
    scope= 'https://www.googleapis.com/auth/admin.directory.user') 
http = httplib2.Http() 
http = credentials.authorize(http) 
service = build(serviceName='admin', version='directory_v1', http=http) 

lists = service.users().get(userKey='jo[email protected]').execute(http=http) 
pprint.pprint(lists) 

Đoạn mã này dường như kết nối đúng cách nhưng khi tôi cố gắng thực hiện truy vấn, tôi nhận được lỗi 403.

LỖI: https://www.googleapis.com/admin/directory/v1/users/[email protected]?alt=json trả lại "không được phép truy cập tài nguyên/api">

Suy nghĩ đầu tiên của tôi là vì tôi chưa bật API này trên bảng điều khiển dành cho quản trị viên (Google API's console) nhưng tôi có. (Thực ra tôi đã bật SDK quản trị chứ không phải API thư mục vì không có API thư mục nào để bật và thấy rằng đó là một phần của SDK quản trị nó sẽ hoạt động?).

Có một bước nào khác mà tôi bị thiếu hoặc tôi đã phạm sai lầm ngớ ngẩn ở đâu đó không?

+0

Bạn đã xác định điều này? Tôi tự hỏi liệu API thư mục (a.k.a. Admin SDK API), cụ thể, có thể được sử dụng với tài khoản dịch vụ và OAuth 2.0. (Tôi biết các API khác có thể.) Tôi có ý nghĩa rằng nó có thể với OAuth 1.0, nhưng tôi chưa thử điều đó. –

+0

@EricWalker - Có xem nhận xét bên dưới. – Bruce

Trả lời

6

Bruce,

bạn khá thân thiết.

Couple các hạng mục:

đang Vậy đầy đủ sẽ xem xét một chút như thế này:

# domain configuration settings 
    import domainconfig 

    f = file(domainconfig.KEY_FILE, "rb") # b reads file in binary mode; not strictly necessary, but safer to avoid strange Windows EOL characters: https://stackoverflow.com/questions/9644110/difference-between-parsing-a-text-file-in-r-and-rb-mode 
    key = f.read() 
    f.close() 

    credentials = SignedJwtAssertionCredentials(

     domainconfig.SERVICE_ACCOUNT_EMAIL, 
     key, 
     scope = domainconfig.SCOPE, 
     sub=domainconfig.SUB_ACCOUNT_EMAIL # 'sub' supercedes the deprecated 'prn' 

    ) 

    http = httplib2.Http() 
    http = credentials.authorize(http) 

    directoryservice = build("admin", "directory_v1", http=http) 

    users = directoryservice.users() 
    response = users.get(userKey='[email protected]').execute() 
+0

Nếu một người đang sử dụng Ruby và 'Signet' của Google, một số sửa đổi đối với thư viện hiện cần thiết để mạo danh quản trị viên hoặc người dùng có vai trò được ủy quyền; xem: https://github.com/google/signet/pull/33 –

0

này cần được sự giúp đỡ: https://developers.google.com/drive/delegation

Khi khẳng định các thông tin bạn cần phải kết nối nó với người sử dụng có nghĩa là sẽ phải thay đổi. Từ liên kết ở trên, lưu ý phần này:

credentials = SignedJwtAssertionCredentials(SERVICE_ACCOUNT_EMAIL, key, 
scope='https://www.googleapis.com/auth/drive', sub=user_email) 
Các vấn đề liên quan