Единый вход с Google Apps + App Engine

Можно ли создать SSO со встроенным OpenId в App Engine? Я пытаюсь интегрировать приложение Marketplace и запускать пользователя, входящего в Google Apps (панель администратора или универсальная навигация). Я потерпел неудачу, и теперь я нашел это:

"Единственное исключение из этого - приложения, которые делают гибридный OpenID/OAuth -" белый список "в настоящее время не работает с этим подходом". (от здесь)

Я предполагаю, что мне нужно реализовать OpenId, используя библиотеку вместо того, чтобы использовать встроенный для достижения единого входа в Google Apps в моем приложении? Или, если это возможно со встроенным OpenId, есть ли где-нибудь пример, который показывает, как это сделать?

Ответы

Ответ 1

Позже Google опубликовал статью о том, как это сделать в Python:

http://code.google.com/googleapps/marketplace/tutorial_python_gae.html

Резюме:

  • В XML-манифесте Marketplace вы должны включить белый список "область OpenID" (домен приложения).
  • Точка входа, используемая для универсальной навигации Google, должна содержать текущий домен Google Apps.
  • Точка входа в приложение перенаправляет пользователя, передающего домен Google Apps, как federated_identity.

Например:

from google.appengine.api import users

# [...]

login_url = users.create_login_url(dest_url='http://my-app.appspot.com/',
                                   _auth_domain=None,
                                   federated_identity=google_apps_domain_name)
self.redirect(login_url)

Ответ 2

Это работало для меня в Java:

Set<String> attributesRequest = new HashSet<String>();
String loginRealm = "http://myapp.appspot.com"; //Important that it is exactly the same as in application-manifest.xml, watch out for trailing slashes.
String destinationURL = req.getRequestURI() + "?" + req.getQueryString();
String federatedIdentity = null;
String authDomain = req.getParameter("hd"); //hd is the default parameter name. Contains the google apps domain name of the user logging on. example.com for example.
String loginUrl = userService.createLoginURL(destinationURL, federatedIdentity, authDomain, attributesRequest);     

Обязательно включите

<Edition id="free">
    <Name>Cloud App Studio</Name>
    <Extension ref="navLink" />
    <Extension ref="realm" />
</Edition>

в application-manifest.xml. То есть, если это бесплатно. Важная часть состоит в том, чтобы включить ref в область.

Ответ 3

Err, у меня нет полной поддержки этой функции, но я использую как JanRain Engage (который использует Stackoverflow), так и приложения GAE. Я думаю, что openid4java тоже может выполнить эту работу.

Ответ 4

вы не указали, какой язык вы используете. если это java, есть библиотека google для openid + oauth.

http://code.google.com/p/step2/

Ответ 5

Вы уже знаете эту ссылку?

UserService userService = UserServiceFactory.getUserService();

if (userService.isUserLoggedIn()) {
  User user = userService.getCurrentUser();
  /* ...Do something with user.getFederatedIdentity(), which is the OpenID URL. */
}