[ https://issues.apache.org/jira/browse/USERGRID-567?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=14494398#comment-14494398 ]
ASF GitHub Bot commented on USERGRID-567: ----------------------------------------- Github user snoopdave commented on a diff in the pull request: https://github.com/apache/incubator-usergrid/pull/221#discussion_r28346513 --- Diff: stack/rest/src/main/java/org/apache/usergrid/rest/management/ManagementResource.java --- @@ -441,6 +451,181 @@ public Viewable handleAuthorizeForm( @Context UriInfo ui, @FormParam( "response_ } + /** + * <p> + * Validates access token from other or "external" Usergrid system. + * Calls other system's /management/me endpoint to get the User associated with the access token. + * If user does not exist locally, then user and organization with the same name of user is created. + * If no user is returned from the other cluster, then this endpoint will return 401. + * <p> + * + * <p> + * See <a href="https://issues.apache.org/jira/browse/USERGRID-567">USERGRID-567</a> + * for details about Usergrid Central SSO. + * </p> + * + * @param ui Information about calling URI. + * @param json JSON object with fields: ext_access_token, ttl + * @param callback For JSONP support. + * @return Returns JSON object with access_token field. + * @throws Exception Returns 401 if access token cannot be validated + */ + @POST + @Path( "/externaltoken" ) + public Response validateExternalToken( + @Context UriInfo ui, + Map<String, Object> json, + @QueryParam( "callback" ) @DefaultValue( "" ) String callback ) throws Exception { + + if ( StringUtils.isEmpty( properties.getProperty( USERGRID_CENTRAL_URL ))) { + throw new NotImplementedException( "External Token Validation Service is not configured" ); + } + + Object extAccessTokenObj = json.get("ext_access_token"); + if ( extAccessTokenObj == null ) { + throw new IllegalArgumentException("ext_access_token must be specified"); + } + String extAccessToken = json.get("ext_access_token").toString(); + + Object ttlObj = json.get("ttl"); + if ( ttlObj == null ) { + throw new IllegalArgumentException("ttl must be specified"); + } + long ttl; + try { + ttl = Long.parseLong(ttlObj.toString()); + } catch ( NumberFormatException e ) { + throw new IllegalArgumentException("ttl must be specified as a long"); + } + + return validateExternalToken( ui, extAccessToken, ttl, callback ); + } + + + /** + * <p> + * Validates access token from other or "external" Usergrid system. + * Calls other system's /management/me endpoint to get the User associated with the access token. + * If user does not exist locally, then user and organization with the same name of user is created. + * If no user is returned from the other cluster, then this endpoint will return 401. + * </p> + * + * <p> Part of Usergrid Central SSO feature. + * See <a href="https://issues.apache.org/jira/browse/USERGRID-567">USERGRID-567</a> + * for details about Usergrid Central SSO. + * </p> + * + * @param ui Information about calling URI. + * @param extAccessToken Access token from external Usergrid system. + * @param ttl Time to live for token. + * @param callback For JSONP support. + * @return Returns JSON object with access_token field. + * @throws Exception Returns 401 if access token cannot be validated + */ + @GET + @Path( "/externaltoken" ) + public Response validateExternalToken( + @Context UriInfo ui, + @QueryParam( "ext_access_token" ) String extAccessToken, + @QueryParam( "ttl" ) @DefaultValue("-1") long ttl, + @QueryParam( "callback" ) @DefaultValue( "" ) String callback ) + throws Exception { + + + if ( StringUtils.isEmpty( properties.getProperty( USERGRID_CENTRAL_URL ))) { + throw new NotImplementedException( "External Token Validation Service is not configured" ); + } + + if ( extAccessToken == null ) { + throw new IllegalArgumentException("ext_access_token must be specified"); + } + + if ( ttl == -1 ) { + throw new IllegalArgumentException("ttl must be specified"); + } + + // look up user via UG Central's /management/me endpoint. + + JsonNode accessInfoNode = getMeFromUgCentral( extAccessToken ); + + JsonNode userNode = accessInfoNode.get( "user" ); + String username = userNode.get( "username" ).getTextValue(); + String name = userNode.get( "name" ).getTextValue(); + String email = userNode.get( "email" ).getTextValue(); + + // set dummy password to random string that nobody can guess, in SSO setup + // admin users should never be able to login directly to this Usergrid system + String dummyPassword = RandomStringUtils.randomAlphanumeric( 40 ); + + // if user does not exist locally then we need to fix that + + final UUID userId; + final OrganizationInfo organizationInfo = management.getOrganizationByName(username); + + if ( organizationInfo == null ) { + + // create local user and personal organization, activate user. + + OrganizationOwnerInfo ownerOrgInfo = management.createOwnerAndOrganization( --- End diff -- Instead of creating an organization with the same name as the username, we should get the list of organizations from the accessInfoNode and create each of those listed. > Validate External Token for Usergrid Central SSO > ------------------------------------------------ > > Key: USERGRID-567 > URL: https://issues.apache.org/jira/browse/USERGRID-567 > Project: Usergrid > Issue Type: Story > Reporter: David Johnson > Assignee: David Johnson > > The requirement is to have multiple Usergrid systems, each with its own > Cassandra cluster, be able to authenticate Admin Users with one central > Usergrid system -- giving Admin Users Single-Sign-On (SSO) across all of > those systems. > We can do this by adding just one new end-point to Usergrid. > This Google Doc explains a complete design for "Usergrid Central SSO": > https://docs.google.com/document/d/12kXgaYcB6L9JoTyRGn0ZHEMg3vL1LJDqvtnltIBDa1Y/edit?usp=sharing > The design is based on earlier work by Ed Anuff and Nate McCall. -- This message was sent by Atlassian JIRA (v6.3.4#6332)