如何从Apps Domain用户获取包含自定义字段的Google个人资料信息?

时间:2013-04-29 14:33:43

标签: google-app-engine google-apps-script google-apps gdata

使用user.profile和user.email范围以及/ oauth2 / v2 / userinfo提要似乎不会返回任何自定义字段(在我的情况下为部门)或电话号码。这些字段显示在域共享联系人目录中。

是否可能有像/ oauth2 / {DOMAIN} / v2 / userinfo这样的Apps Domain特定供稿网址?

API /服务不支持任何自定义字段吗?

有没有办法将其捏造成工作?

对您自己的应用程序域共享联系人配置文件的读访问权限应该不会那么困难。

我更喜欢非管理员解决方案,因为我的域使用带SAML身份验证的通用访问卡,所以我不能只在App Engine应用程序中存储管理员凭据(用户:密码)并访问/ m8 / feed。如果有一个流程来访问具有预先授权的消费者密钥和秘密的域共享联系人(带有自定义字段),我会对使其工作的说明感兴趣。

编辑 Jay Lee将其钉在了“https://www.google.com/m8/feeds/gal/ {domain} / full”

以下是使用Google Apps脚本的概念验证脚本(我将在完成后添加最终的OAuth2版本)

function getGal(email, passwd, domain) {
  var res = UrlFetchApp.fetch("https://www.google.com/accounts/ClientLogin", {
    contentType: "application/x-www-form-urlencoded",
    method: "post",
    payload: { "Email": email, "Passwd": passwd, "accountType": "HOSTED", "service":"cp" }
  });
  var auth = res.getContentText().match(/Auth=(.*)/i)[1];
  Logger.log("Auth: " + auth);
  res = UrlFetchApp.fetch("https://www.google.com/m8/feeds/gal/" + domain + "/full", {
    method: "get",
    headers: { "Authorization": "GoogleLogin auth=" + auth, "GData-Version": "1.0" }
  });
  Logger.log(res.getHeaders());
  Logger.log(res.getContentText());
}

编辑2 OAuth版本,返回JSON,只返回访问脚本的用户的信息。

function googleOAuthM8() {
  var oAuthConfig = UrlFetchApp.addOAuthService("m8");
  oAuthConfig.setRequestTokenUrl('https://www.google.com/accounts/OAuthGetRequestToken?scope=https://www.google.com/m8/feeds/');
  oAuthConfig.setAuthorizationUrl('https://www.google.com/accounts/OAuthAuthorizeToken');
  oAuthConfig.setAccessTokenUrl('https://www.google.com/accounts/OAuthGetAccessToken');
  oAuthConfig.setConsumerKey('anonymous');
  oAuthConfig.setConsumerSecret('anonymous');
  return {oAuthServiceName:"m8", oAuthUseToken:'always'};
}
function getGal(domain) {
  res = UrlFetchApp.fetch("https://www.google.com/m8/feeds/gal/" + domain + "/full?alt=json&q=" + Session.getActiveUser().getEmail(), googleOAuthM8());
  Logger.log(res.getHeaders());
  Logger.log(res.getContentText());
}

3 个答案:

答案 0 :(得分:10)

任何非管理员用户都可以通过编程方式访问GAL,请参阅:

https://github.com/google/gfw-deployments/blob/master/apps/shell/gal/gal_feed.sh

我不认为此API调用是正式记录或支持的,但它甚至可以使用OAuth身份验证而不是示例的ClientLogin(在OAuth 2.0操场上使用非管理员用户和标准https://www.google.com/m8/feeds/联系人进行测试范围)。

请注意,全局地址列表是用户配置文件,组和共享联系人的汇编。您需要解析它以找到您希望获得部门信息的用户。

答案 1 :(得分:2)

我会利用Google Apps Profiles API执行此操作。它会为您提供一系列元信息,包括个人资料数据甚至个人资料照片: https://developers.google.com/google-apps/profiles/

即使您使用的是PIV / CAC / SAML,也可以使用Two-Legged-OAuth进行身份验证。 https://developers.google.com/accounts/docs/OAuth#GoogleAppsOAuth

双腿oauth是阻力最小的路径,但你也应该看看OAuth2,特别是JWT签名的服务帐户部分 - 但是,使用旧的GData可能有点棘手xml apis。

就可用字段而言,您必须使用此页面上的字段。您可以在扩展属性中添加任意数据,但它们不会显示在带有Google Mail的联系人浏览器中: https://developers.google.com/gdata/docs/2.0/elements#gdProfileKind

在旁注中,如果您在LDAP环境中(并且因为您提到了CAC,我认为您可能是这样),您应该查看Google Apps Directory Sync,它可以将该配置文件数据与您的本地AD同步/ LDAP。

来源:我将Google Apps部署到大型组织(3000+),公共和私人。

答案 2 :(得分:0)

我在TwoLeggedOAuthHmacToken中使用了以下方法: 消费者密钥和密钥可以在谷歌应用程序管理仪表板中找到

CONSUMER_KEY = 'domain.com'
CONSUMER_SECRET = 'secret_key'


class ContactClient():
    def __init__(self, username):
        # Contacts Data API Example ====================================================
        self.requestor_id = username + '@' + CONSUMER_KEY
        self.two_legged_oauth_token = gdata.gauth.TwoLeggedOAuthHmacToken(
            CONSUMER_KEY, CONSUMER_SECRET, self.requestor_id)

        self.contacts_client = gdata.contacts.client.ContactsClient(source=SOURCE_APP_NAME)
        self.contacts_client.auth_token = self.two_legged_oauth_token

    def newuser(self, username):
        self.contacts_client.auth_token.requestor_id = username + '@' + CONSUMER_KEY

    def getContacts(self, username=None):
        if username:
            self.newuser(username)
        return self.contacts_client.GetContacts()


class MainPage(webapp2.RequestHandler):
    def get(self):
        contacts = ContactClient(username='username')
        feed = contacts.getContacts()
        output = ""
        if feed:
              for entry in feed.entry:
                if entry.title and entry.title.text:
                    output += entry.title.text + "<br/>"
                for email in entry.email:
                    if email.primary and email.primary == 'true':
                        output += '&nbsp;%s<br/>' % (email.address)
        self.response.headers['Content-Type'] = 'text/html'
        self.response.write('''<h1>Contact Access via GData Client</h1>''' + output)