Using your existing CakePHP website to authenticate users into a Vanilla forum (so they don’t have to setup another account) is fairly simple…once you know how:
In your Cake site:
- Download the PHP jsConnect client library as described here
- Create a ‘vanilla’ directory in app/Vendor and copy into it functions.jsconnect.php from the download in 1.
- In UsersController.php add:
App::import( 'Vendor', 'FunctionsJsconnect', array('file' => 'vanilla' . DS . 'functions.jsconnect.php') );
- Paste index.php from the download in 1 into View/Users and rename it as vanilla_authenticate.ctp. Edit so that it contains only:
// 1. Get your client ID and secret here. These must match those in your jsConnect settings. $clientID = "your_client_id_from_js_connect_plugin_settings_page"; $secret = "your_secret_from_js_connect_plugin_settings_page"; // 3. Fill in the user information in a way that Vanilla can understand. // CHANGE THESE FOUR LINES. $user['uniqueid'] = $user_data['your_cake_id_field']; $user['name'] = $user_data['your_cake_username_field']; $user['email'] = $user_data['your_cake_email_field']; $user['photourl'] = $user_data['your_cake_avatar_field']; // 4. Generate the jsConnect string. // This should be true unless you are testing. // You can also use a hash name like md5, sha1 etc which must be the name as the connection settings in Vanilla. $secure = true; WriteJsConnect($user, $_GET, $clientID, $secret, $secure);
- In UsersController.php, add a vanilla_authenticate action:
public function vanilla_authenticate(){ if ($this->Auth->loggedIn()){ //user is logged in so pass necessary data through to view $this->layout = 'ajax'; $user_data = $this->Auth->user(); $this->set('user_data', $user_data); } }
- Again in UsersController.php, modify your login action:
public function login() { if ($this->request->is('post')) { ... //Do your normal login business which includes the line $this->redirect($this->Auth->redirectUrl()); //after successful login ... } //add following to handle get request from jsConnect else{ if(isset($this->request->query['source'])&&$this->request->query['source']=="vanilla"){ //we need to redirect to vanilla after login so change redirectURL $this->Auth->redirectUrl('http://www.yourvanillasite.com/index.php?p=/entry/jsconnect&client_id=your_client_id_from_js_connect_plugin_settings_page&Target=http://www.yourvanillasite.com'); //big thanks to @hgtonight for this snippet } } }
In your Vanilla forum:
- Download and enable the jsConnect plugin (at the moment, the advice is to use 1.03 as 1.4.1 is still buggy, reporting a ‘regex’ error);
- In the jsConnect plugin settings:
- autogenerate (using the button at the bottom) a ClientID and Secret;
- the Site Name: Your Cake Site – this will appear as ‘Sign in with {site name}’ when users go to the Vanilla forum
- Authenticate URL: http://www.yourcakesite.com/users/vanilla_authenticate
- Sign In URL: http://www.yourcakesite.com/users/login?source=vanilla
- Register URL: http://www.yourcakesite.com/users/register
Well, that’s what worked for me anyway….
Vanilla Community’s x00 tells me that you can avoid the complicated redirect in Cake Step 6 above (and replace with:
$this->Auth->redirectUrl('www.yourvanillasite.com');
if you use the jsConnect AutoSignIn Plugin…but I haven’t tried this yet.
Good luck.