3

Google グループ (組織) のメンバーを読み取るために Google 管理ディレクトリ API を使用しようとしています - 正常に動作します。メンバーを追加しようとすると、次のようになります。

{ errors: 
   [ { domain: 'global',
       reason: 'required',
       message: 'Missing required field: member' } ],
  code: 400,
  message: 'Missing required field: member' }

エラーをグーグルで検索したところ、このような質問、これ、およびその他の役に立たない結果がいくつか見つかりました。

確認したところ、スコープやアクセス許可が欠落しているわけではありません。

#!/usr/bin/python
import httplib2
import json
from oauth2client.client import SignedJwtAssertionCredentials
from urllib import urlencode


def get_group_members(group):
    url = 'https://www.googleapis.com/admin/directory/v1/groups/{}/members'.format(group['email'])
    return call_google_api("GET", url)


def add_group_member(group, payload=False):
    url = 'https://www.googleapis.com/admin/directory/v1/groups/{}/members'.format(group)
    return call_google_api("POST", url, payload)


def call_google_api(method, url, payload=False):
    content = {}
    try:
        http = get_conn()
        if payload:
            (resp, content) = http.request(uri=url, method=method, body=urlencode(payload))
        else:
            (resp, content) = http.request(uri=url, method=method)
    except Exception as e:
        print "Failed to post request to [{}] due to: {}".format(url, e)
    return json.loads(content)

def get_conn():
    client_email = get_client_email_from_db()    
    with open(get_private_key_filename()) as f:
        private_key = f.read()

    oauth_scope = ['https://www.googleapis.com/auth/admin.directory.group.member', 
                  'https://www.googleapis.com/auth/admin.directory.group',
    ]

    credentials = SignedJwtAssertionCredentials(client_email, private_key, oauth_scope, sub='googleapi@organization.com')
    http = httplib2.Http()
    return credentials.authorize(http)


if __name__ == '__main__':
    payload = {
        "email": "test-user@organization.com",
        "role": "MEMBER",
    }
    print "\n ---------------------------------- \n"
    print "calling add_group_member('test-user@organization.com', 'test-group@organization.com')"
    res = add_group_member("test-group@organization.com", payload)
    print "\n ---------------------------------- \n"

コメント:
私は sdk を使用して私が望んでいたことを達成することができましたapiclient.discovery.buildが、それでも、何が問題で、解決できるかどうか興味があります。

リクエストのデバッグ:

connect: (www.googleapis.com, 443)
send: 'POST /admin/directory/v1/groups/xxxx@xxxx.com/members HTTP/1.1\r\nHost: www.googleapis.com\r\nContent-Length: 38\r\ncontent-type: application/json\r\naccept-encoding: gzip, deflate\r\nauthorization: Bearer ya29.RAFzf3hyxvP0LuR4VdpqKr_dD0WzOcvXjn4eWV5Em6xJDissi4ieOZ2ZBRMOP-WLhvTrecBxgF_6sznc1GKSWHanvgYTh_EzcilsAN0f5jOiiMahOadG2v5ixBPL9GcqebRdz_kQc1y2iQ\r\nuser-agent: Python-httplib2/0.9 (gzip)\r\n\r\nrole=MEMBER&email=alfasi%40xxxx.com'
reply: 'HTTP/1.1 400 Bad Request\r\n'
header: Vary: Origin
header: Vary: X-Origin
header: Content-Type: application/json; charset=UTF-8
header: Content-Encoding: gzip
header: Date: Sat, 28 Mar 2015 23:14:47 GMT
header: Expires: Sat, 28 Mar 2015 23:14:47 GMT
header: Cache-Control: private, max-age=0
header: X-Content-Type-Options: nosniff
header: X-Frame-Options: SAMEORIGIN
header: X-XSS-Protection: 1; mode=block
header: Server: GSE
header: Alternate-Protocol: 443:quic,p=0.5
header: Transfer-Encoding: chunked
4

2 に答える 2

3

Google API は (のみ?) JSON エンコーディングを使用するため、投稿データは必要なメンバー オブジェクトに解析されていません。すでに応答用に json をロードしているため、エンコーディングを変更する必要があり、必要に応じて明示的に示す必要があります。

 if payload:
        (resp, content) = http.request(uri=url, method=method, body=urlencode(payload))
 # becomes:   
 if payload:
        (resp, content) = http.request(uri=url, method=method, body=json.dumps(payload), headers={'Content-type':'application/json'})
于 2015-03-24T20:51:42.577 に答える
0

初めてユーザーをグループに追加しようとする場合、役割は MEMBER でなければなりません。それ以外の場合は、このエラーが発生します-必要なフィールドがありません:メンバー。

したがって、最初にユーザーを MEMBER として追加してから、他のロールを指定します。

于 2015-04-09T09:31:22.993 に答える