2013-04-29 2 views
2

Использование области user.profile и user.email и/oauth2/v2/userinfo не возвращает никаких настраиваемых полей (в моем случае Department) или телефонных номеров. Эти поля отображаются в каталоге общих доменных контактов.Как получить информацию о профиле Google, в том числе настраиваемые поля из пользователя домена Apps?

Возможно, есть URL-адрес для определенного домена приложения, например/oauth2/{DOMAIN}/v2/userinfo?

Поддерживает ли API/сервис какие-либо пользовательские поля?

Есть ли способ вымыть это для работы?

Прочитайте доступ к своему собственному профилю домена общих контактов домена, который подключен к вашей учетной записи, не должен быть таким сложным.

Я бы предпочел решение без администратора, потому что мой домен использует общие карты доступа с аутентификацией SAML, поэтому я не могу просто хранить учетные данные администратора (пользователь: пароль) в приложении App Engine и получить доступ к/m8/feed , Если есть поток для доступа к общим контактам домена (с настраиваемыми полями) с предварительно авторизированным ключом пользователя и тайной, мне бы хотелось узнать, как это работает.

EDIT Джей Ли прибил его «https://www.google.com/m8/feeds/gal/ {домен}/полный»

Вот доказательство концепции сценария с помощью Google Apps Script (я добавлю окончательный вариант 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()); 
} 

EDIT 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()); 
} 
+0

Вам нужно использовать API данных Google? – likeitlikeit

+0

@likeitlikeit - Если вы делаете вывод, я делаю что-то вроде того, чтобы нажимать пользовательские данные прямо из LDAP в Google Doc и ссылаться на этот документ в моих приложениях, что для меня не является жизнеспособным решением (к сожалению). –

+0

Что-то вроде этого могло быть решением. – likeitlikeit

ответ

10

Любой пользователь без администратор может получить доступ к GAL программно, см:

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

Я не верю, что этот вызов API документирован или поддерживается официально, но он работает даже с аутентификацией OAuth, а не с ClientLogin примера (проверен на O Auth 2.0 с пользователем, не являющимся администратором, и стандартным полем https://www.google.com/m8/feeds/ Contacts).

Обратите внимание, что глобальный список адресов представляет собой сборник профилей пользователей, групп и общих контактов. Вам нужно будет разобрать его, чтобы найти пользователей (пользователей), для которых вы хотите получить информацию отдела.

+1

Ты мужчина Джей, я был уверен, что есть что-то, что вы могли бы добавить в канал m8, чтобы заставить его работать, и это было «gal». Все пользовательские поля находятся в ответе. Я обновляю свой вопрос с помощью фрагмента рабочего кода, который в вашей ссылке использует HTTP вместо HTTPS для URL-адреса канала, который больше не работает. –

+0

Возможно, это было снято. Я получаю «Ответ сервера: 404, недопустимый URI запроса» – six8

+0

@ Джей Ли. Можно ли получить пользователей из gmail? –

2

Для этого я использовал API профилей Google Apps. Это даст вам кучу мета информации, включая данные профиля и даже фотографии профиля: https://developers.google.com/google-apps/profiles/

Даже если вы используете PIV/CAC/SAML, вы сможете авторизовать с помощью двуногих-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+), общедоступных и частных.

+0

В документации по API профилей не упоминается OAuth или OAuth2, но в нем конкретно указывается имя пользователя и пароль администратора. У меня создалось впечатление, что двунаправленный OAuth устарел, поэтому, возможно, лучше всего будет использовать JWT-маршрут, но могу ли я делегировать ему права только на чтение для общих профилей домена? Что касается LDAP Sync (я думаю, что я знаю, что это датировано), теперь он может обновлять профили пользователей домена приложения, а не только профили общих контактов домена, похоже, существует разрыв между ними? –

0

Я использовал следующий подход с TwoLeggedOAuthHmacToken: Потребительский ключ и секрет можно найти в администратора Google Dashboard

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) 
+0

Я хочу профиль профиля общего домена для текущего пользователя. Кажется, что канал m8 возвращает профиль учетной записи, а не профиль профиля общего домена, связанный с учетной записью, поэтому ему не удалось настроить специальные поля, которые были синхронизированы с ним с помощью утилиты Google LDAP Sync. –

Смежные вопросы