3

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

是否有类似 /oauth2/{DOMAIN}/v2/userinfo 之类的特定于应用程序域的提要 URL?

API/服务是否还不支持任何自定义字段?

有没有办法把它变成工作?

读取与您的帐户相关联的您自己的应用程序域共享联系人配置文件的权限应该不会那么困难。

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

编辑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());
}
4

3 回答 3

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/联系人范围进行测试)。

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

于 2013-05-08T16:52:20.057 回答
2

我会利用 Google Apps Profiles API 来做到这一点。它会给你一堆元信息,包括个人资料数据甚至个人资料照片: https ://developers.google.com/google-apps/profiles/

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

双腿 oauth 是阻力最小的路径,但您还应该看看 OAuth2,尤其是 JWT 签名的服务帐户部分——但是,使用旧的 GData xml api 可能有点棘手。

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

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

资料来源:我将 Google Apps 部署到大型组织(超过 3000 家),包括公共和私人。

于 2013-05-02T23:52:35.280 回答
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)
于 2013-05-08T10:30:48.330 回答