2010-08-28 14 views
14

È possibile ottenere SSO con OpenId integrato su App Engine? Ho cercato di integrare un'app di Marketplace e ottenere l'accesso dell'utente quando proviene da Google Apps (il pannello di amministrazione o la navigazione universale). Ho fallito miseramente, quindi ora ho trovato questo:Single Sign-On con Google Apps + App Engine

"L'unica eccezione a questa sono le applicazioni che fanno OpenID ibrida/OAuth - la whitelist attualmente non funziona con questo approccio." (da here)

Suppongo che devo implementare OpenId utilizzando una libreria invece di utilizzare quella integrata per ottenere SSO con Google Apps nella mia app? O se è possibile con OpenId integrato, c'è un esempio ovunque che mostra come farlo?

+0

Non si specifica in particolare se si conferma che l'app di mercato che si sta integrando fa l'OpenID/OAuth ibrido o quale app marketplace è. –

risposta

6

tardi Google ha pubblicato un articolo su come farlo in Python:

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

La sintesi è:

  • Devi whitelist il vostro "regno OpenID" (l'applicazione dominio) nel XML manifest del Marketplace.
  • Il punto di ingresso utilizzato per la navigazione universale di Google deve contenere il dominio Google Apps corrente.
  • Il punto di ingresso nell'app reindirizza l'utente che passa il dominio Google Apps come federated_identity.

Ad esempio:

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) 
1

Err, non ho ottenuto lo scoop completo su questa funzione, ma uso sia JanRain Engage (che StackOverflow utilizza) con le app GAE. Penso che openid4java potrebbe fare anche il lavoro.

1

Conoscevi già this link?

UserService userService = UserServiceFactory.getUserService(); 

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

questo ha lavorato per me in 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);  

Assicurati di includere

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

nell'applicazione-manifest.xml. Cioè, se è gratuito. La parte importante è includere il riferimento al regno.

+1

Grazie Paul, funziona benissimo! Nota agli altri: metti questo nel servlet che mappa a/_ah/login_required come menzionato qui: http://code.google.com/appengine/articles/openid.html – Stefan