Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
WordPress Page Template for SSO with Discourse
<?php
/**
* Template Name: Discourse SSO
* Author: Adam Capriola
* Version: 1.1
* Author URI: https://meta.discourse.org/users/AdamCapriola/activity
* Adapted From: https://github.com/ArmedGuy/discourse_sso_php
* Uses: https://meta.discourse.org/t/official-single-sign-on-for-discourse/13045
*
*/
// Customize these two variables
$sso_secret = 'meow';
$discourse_url = 'http://discourse.example.com'; // Note: No trailing slash!
//
// Check if user is logged in to WordPress
//
// Not logged in to WordPress, redirect to WordPress login page with redirect back to here
if ( ! is_user_logged_in() ) {
// Preserve sso and sig parameters
$redirect = add_query_arg();
// Change %0A to %0B so it's not stripped out in wp_sanitize_redirect
$redirect = str_replace( '%0A', '%0B', $redirect );
// Build login URL
$login = wp_login_url( $redirect );
// Redirect to login
wp_redirect( $login );
exit;
}
// Logged in to WordPress, now try to log in to Discourse with WordPress user information
else {
// Payload and signature
$payload = $_GET['sso'];
$sig = $_GET['sig'];
// Change %0B back to %0A
$payload = urldecode( str_replace( '%0B', '%0A', urlencode( $payload ) ) );
// Check for helper class
if ( ! class_exists( 'Discourse_SSO' ) ) {
// Error message
echo( 'Helper class is not properly included.' );
// Terminate
exit;
}
// Validate signature
$sso = new Discourse_SSO( $sso_secret );
if ( ! ( $sso->validate( $payload, $sig ) ) ) {
// Error message
echo( 'Invalid request.' );
// Terminate
exit;
}
// Nonce
$nonce = $sso->getNonce( $payload );
// Current user info
get_currentuserinfo();
// Map information
$params = array(
'nonce' => $nonce,
'name' => $current_user->display_name,
'username' => $current_user->user_login,
'email' => $current_user->user_email,
'about_me' => $current_user->description,
'external_id' => $current_user->ID
);
// Build login string
$q = $sso->buildLoginString( $params );
// Redirect back to Discourse
wp_redirect( $discourse_url . '/session/sso_login?' . $q );
exit;
}
@espoal

This comment has been minimized.

Copy link

@espoal espoal commented Oct 6, 2014

why you dont close the php tag?

@hanchang

This comment has been minimized.

Copy link

@hanchang hanchang commented Oct 14, 2014

@servermeta It's standard practice to leave the PHP tag unclosed to prevent unwanted whitespace at the end of a file which may cause the script to send header info earlier than desired:
http://stackoverflow.com/questions/4410704/why-would-one-omit-the-close-tag

@hanchang

This comment has been minimized.

Copy link

@hanchang hanchang commented Oct 14, 2014

@nikhilkumarreddyvedere

This comment has been minimized.

Copy link

@nikhilkumarreddyvedere nikhilkumarreddyvedere commented Aug 9, 2018

Helper class is not properly included. how to include helper class

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment