Приложение Marketplace Provisioning API: проверьте, является ли пользователь администратором

#google-app-engine #provisioning #google-apps #google-apps-marketplace

#google-app-engine #подготовка #google-приложения #google-приложения-marketplace

Вопрос:

Я пытаюсь проверить, является ли пользователь администратором своего домена Google Apps в приложении, установленном с Google Apps marketplace.

Я добавил это в manifest.xml:

 <Scope id="Provisioning API">
  <Url>https://apps-apis.google.com/a/feeds/user/#readonly</Url>
  <Reason>This application can list domain users to give them permissions.</Reason>
</Scope>
  

Затем я установил обработчик тестов, чтобы заставить его работать:

 from google.appengine.ext import webapp
from google.appengine.ext.webapp import util

import gdata.alt.appengine
import gdata.apps.service
import gdata.auth

# App id, key and secret from the Google Apps Marketplace.
APPLICATION_ID = 'XXX'
CONSUMER_KEY = 'XXX'
CONSUMER_SECRET = 'XXX'

class SetupHandler(webapp.RequestHandler):
    def get(self, *args):
        # The domain where this app is installed.
        domain = 'my_customer_domain.com'
        # A username to check.
        username = 'webmaster'

        sig_method = gdata.auth.OAuthSignatureMethod.HMAC_SHA1
        service = gdata.apps.service.AppsService(source='tipfy-com',
                                                 domain=domain)
        service.SetOAuthInputParameters(sig_method, CONSUMER_KEY,
                                        consumer_secret=CONSUMER_SECRET,
                                        two_legged_oauth=True,
                                        requestor_id=APPLICATION_ID)
        service.ssl = True
        service.debug = True
        gdata.alt.appengine.run_on_appengine(service)

        lookup_user = service.RetrieveUser(username)
        if lookup_user.login.admin == 'true':
            res = username   ' is an admin.'
        else:
            res = username   ' is not an admin.'

        self.response.out.write(res)

app = webapp.WSGIApplication([
    ('/.*', SetupHandler),
], debug=True)

def main():
    util.run_wsgi_app(app)

if __name__ == '__main__':
    main()
  

Но я получаю ответ 401 («Заголовок неизвестной авторизации»). Я не знаю, что я делаю неправильно или как это отладить дальше.

  • Правильна ли запись в манифесте?
  • Разделение user.email() нормально для получения имени пользователя и домена пользователя? (Я отладил это, и в моем случае это было: я получил ‘webmaster’ и ‘example.com ‘, который был пользователем и доменом Google Apps, где было установлено приложение).

Чего я не понимаю?

Редактировать: По какой-то причине панель администратора не запрашивала разрешения на предоставление доступа к предоставленным областям. После того, как я предоставил это, приведенный выше код сработал. Итак, возьмите это в качестве рабочего примера!

Комментарии:

1. Просто мысль, но вы знаете, что когда вы добавляете новую <область> в существующее приложение marketplace, администратор должен зайти в панель управления, чтобы «ОК» новый запрос?

2. Я тестирую его в своем собственном домене (приложение еще не выпущено). Итак, я фактически удалил приложение и повторно добавил его с новой областью.

Ответ №1:

Вам не нужно повторно добавлять свое приложение для работы с областями, просто убедитесь, что на панели управления администратора GoogleApps в настройках приложения вы «Предоставляете доступ», а доступ к данным «Предоставлен«. В противном случае просто предоставьте этот доступ.

Разделение user.email() работает для меня как шарм, потому что user.nickname() при тестировании localhost содержит полное электронное письмо, а не как при производстве (где оно содержит имя пользователя).

Убедитесь, что запрашивающий пользователь является администратором.

Комментарии:

1. Я не могу поверить. Все работало, но доступ не был предоставлен! По какой-то причине манифест был обновлен, но утверждение разрешения «Предоставить» так и не появилось в admin. Obrigado!

2. Просто примечание: user.nickname() не работает с приложениями единого входа, поскольку псевдоним будет идентификатором OpenID — ничего, связанного с именем пользователя Google Apps. Чтобы получить имя пользователя, я использовал user.email().split('@', 1)[0] .

Ответ №2:

Я столкнулся с точно такой же проблемой, которая продолжает вызывать у меня:

Неизвестный заголовок авторизации

Ошибка 401

Я использую бесплатную версию Google Apps, может ли это быть основной причиной этой проблемы? Насколько я знаю, Provisioning API поддерживает только премиум-аккаунт.

Ответ №3:

API администратора [provisioning api и т.д.] Теперь доступны для версий приложений Google.

http://googleappsdeveloper.blogspot.com/2011/12/more-administrative-apis-now-available.html