Sample Resource App

Overview

This is a sample Resource App. It uses SAML SSO to identify the user, obtains OAuth credentials and imports content into Schoology.

Requirements

The following is needed to run this application:

  • The Sample App files
  • A Schoology-assigned OAuth consumer key and consumer secret
  • A web server that can run PHP
  • The Schoology PHP SDK (included in project files)
  • A MySQL database to store the user's OAuth access key

Getting Started

You will need a MySQL database for this project. Enter the database credentials for this application below

define('DB_HOSTNAME', ''); // Database hostname
define('DB_USERNAME', ''); // Database username
define('DB_PASSWORD', ''); // Database password
define('DB_DATABASE', ''); // Database name

Enter your Schoology-assigned consumer key and secret

define('SCHOOLOGY_CONSUMER_KEY', ''); // Your apps schoology consumer key
define('SCHOOLOGY_CONSUMER_SECRET', ''); // Your apps schoology consumer secret

This sample application uses the following database table to store OAuth credentials. Create the schoology_oauth_tokens table using the SQL create statement below

CREATE TABLE  `schoology_oauth_tokens` (
    `uid` int(10) unsigned NOT NULL,
    `token_key` varchar(64) CHARACTER SET utf8 NOT NULL,
    `token_secret` varchar(64) CHARACTER SET utf8 NOT NULL,
    `token_is_access` tinyint(3) unsigned NOT NULL,
    PRIMARY KEY (`uid`)
 ) DEFAULT CHARSET=utf8 COLLATE=utf8_bin;

Authentication

This Resource App uses SAML SSO to identify the user and obtain OAuth credentials

/**
 * Authentication with SAML 2.0
 */
function schoology_login() {
  if(!$_GET['login']) {
    return;
  }
  
  // Initialize the Schoology class
  $schoology = new SchoologyContentApi(SCHOOLOGY_CONSUMER_KEY, SCHOOLOGY_CONSUMER_SECRET);
  
  // Read the incoming login information.
  $login = $schoology->validateLogin();

  // If the last step failed, then either no information
  // was received or it was invalid.
  if(!$login){
    // Stop script execution
    print 'No login information was received. Try loading this application again from within Schoology.'; exit;
  }

  // If our session already has a stored ID but it's
  // different from what we received, restart the session.
  if(isset($_SESSION['schoology']['uid']) && $_SESSION['schoology']['uid'] != $login['uid']){
    session_destroy();
    session_start();
  }
  
  // The session might already be set if the user is accessing
  // this application again without logging out of Schoology.
  // Only set the session information if not already present
  if(!isset($_SESSION['schoology']['uid'])){
    $_SESSION['schoology'] = $login;
    $_SESSION['session_created'] = time();
  }
  
  $q_params = parse_url($_REQUEST['RelayState'], PHP_URL_QUERY);
  parse_str($q_params, $app_state);
  
  $_SESSION['app_state'] = array();
  foreach($app_state as $key => $param){
    $_SESSION['app_state'][$key] = $param;
  }
  
  header('Location: ' . $_REQUEST['RelayState']); exit;
}
// Setup our Resource App
require_once('lib/SchoologyApp.php');

// Initialize the session
session_start();

// Authentication with SAML 2.0
schoology_login();

$uid = $_SESSION['schoology']['uid'];
$session_created = $_SESSION['session_created'];
$site_base = ($_SESSION['app_state']['is_ssl'] ? 'https://' : 'http://') . $_SESSION['schoology']['domain'];
$schoology = new SchoologyContentApi(SCHOOLOGY_CONSUMER_KEY, SCHOOLOGY_CONSUMER_SECRET, $site_base);

// Make sure a user is logged in
if(!$uid){
  print 'No user information was found when loading this page. Please try loading this application from within Schoology.'; exit;
}
...

At this point, we should now have a user ID that we can work with. Now that you know who is accessing your application, we can start using the Schoolgy SDK to communicate with the API (eg, import content into Schoology)

Import Content

The following function is responsible for importing content into Schoology (see import workflow).

/**
 * Import content into Schoology
 */
function schoology_import(SchoologyContentApi $schoology) {
  if(!$_GET['import']) {
    return;
  }
  
  $content = schoology_get_sample_content();
  $return_url = 'https://sample_content_app.subdomain.psmith.dev.schoologize.com/index.php';
  
  try {
    switch($_GET['import']) {
      case 'link':
        $import_id = $schoology->importLink($content['link']['title'], $content['link']['url']);
        $import_url = $schoology->buildImportUrl($import_id, $return_url);
        break;
      
      case 'embed':
        $import_id = $schoology->importLink($content['embed']['title'], $content['embed']['embed']);
        $import_url = $schoology->buildImportUrl($import_id, $return_url);
        break;

      case 'file':
        $import_id = $schoology->importFile($content['file']['filepath']);
        $import_url = $schoology->buildImportUrl($import_id, $return_url);
        break;

      case 'bulk':
        $body = array(
          'link' => array(
            array('title' => $content['link']['title'], 'url' => $content['link']['url']),
          ),

          'embed' => $embeds = array(
            array('title' => $content['embed']['title'], 'embed' => $content['embed']['embed']),
          ),

          'file-attachment' => array('id' => array(
            $schoology->apiFileUpload($content['file']['filepath']),
          )),
        );
        $result = $schoology->importBulk($body);

        $import_ids = array();
        foreach($result as $i) {
          $import_ids[] = $i->import_id;
        }
        $import_url = $schoology->buildImportUrl($import_ids, $return_url);
        break;
    }
    
  } catch (Exception $e) {
    print $e->getMessage(); exit;
  }
  
  // Redirct user to schoology import form
  header('Location: ' . $import_url); exit;    
}

More Examples: Import web link

// Use API to import link and retrieve an import ID
$import_id = $schoology->importLink('Schoology Developers', 'https://developers.schoology.com/');

// Use API utility function @buildImportUrl() to generate the Schoology Import URL
$import_url = $schoology->buildImportUrl($import_id, $return_url);

// Redirct user to Schoology Import Form
header('Location: ' . $import_url); exit;

// After import, Schoology will return the user to the specified $return_url. 
// You can use this $return_url to customize a success message

Summary

Congratulations on your first working Resource App! Resource Apps allow users to import content easily from third-party providers. Please refer to the Resource Apps docs for further details.