mirror of https://github.com/flarum/flarum
130 lines
3.4 KiB
PHP
130 lines
3.4 KiB
PHP
<?php
|
|
|
|
class SSOController
|
|
{
|
|
const REMEMBER_ME_KEY = 'flarum_remember';
|
|
|
|
private $config;
|
|
|
|
public function __construct()
|
|
{
|
|
$this->config = require __DIR__ . '/config.php';
|
|
}
|
|
|
|
/**
|
|
* Call this method after your user is successfully authenticated.
|
|
*
|
|
* @param $username
|
|
* @param $email
|
|
* @param $avatarUrl
|
|
*/
|
|
public function login($username, $email, $avatarUrl)
|
|
{
|
|
$password = $this->createPassword($username);
|
|
$token = $this->getToken($username, $password);
|
|
|
|
if (empty($token)) {
|
|
$this->signup($username, $password, $email, $avatarUrl);
|
|
$token = $this->getToken($username, $password);
|
|
}
|
|
|
|
$this->setRememberMeCookie($token);
|
|
}
|
|
|
|
/**
|
|
* Call this method after you logged out your user.
|
|
*/
|
|
public function logout()
|
|
{
|
|
$this->removeRememberMeCookie();
|
|
}
|
|
|
|
/**
|
|
* Redirects a user back to the forum.
|
|
* @param $targetUrl
|
|
*/
|
|
public function redirectToForum($targetUrl)
|
|
{
|
|
$targetUrl = (!is_null($targetUrl)) ? $targetUrl : '';
|
|
header('Location: ' . $this->config['flarum_url'] . $targetUrl);
|
|
die();
|
|
}
|
|
|
|
private function createPassword($username)
|
|
{
|
|
return hash('sha256', $username . $this->config['password_token']);
|
|
}
|
|
|
|
private function getToken($username, $password)
|
|
{
|
|
$data = [
|
|
'identification' => $username,
|
|
'password' => $password,
|
|
'lifetime' => $this->getLifetimeInSeconds(),
|
|
];
|
|
|
|
$response = $this->sendPostRequest('/api/token', $data);
|
|
|
|
return isset($response['token']) ? $response['token'] : '';
|
|
}
|
|
|
|
private function signup($username, $password, $email, $avatarUrl)
|
|
{
|
|
$data = [
|
|
"data" => [
|
|
"type" => "users",
|
|
"attributes" => [
|
|
"username" => $username,
|
|
"password" => $password,
|
|
"email" => $email,
|
|
"avatarUrl" => $avatarUrl
|
|
]
|
|
]
|
|
];
|
|
|
|
$response = $this->sendPostRequest('/api/users', $data);
|
|
|
|
return isset($response['data']['id']);
|
|
}
|
|
|
|
private function sendPostRequest($path, $data)
|
|
{
|
|
$data_string = json_encode($data);
|
|
|
|
$ch = curl_init($this->config['flarum_url'] . $path);
|
|
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
|
|
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_string);
|
|
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
|
|
curl_setopt($ch, CURLOPT_HTTPHEADER, [
|
|
'Content-Type: application/json',
|
|
'Content-Length: ' . strlen($data_string),
|
|
'Authorization: Token ' . $this->config['flarum_api_key'] . '; userId=1',
|
|
]
|
|
);
|
|
$result = curl_exec($ch);
|
|
|
|
return json_decode($result, true);
|
|
}
|
|
|
|
private function setRememberMeCookie($token)
|
|
{
|
|
$this->setCookie(self::REMEMBER_ME_KEY, $token, time() + $this->getLifetimeInSeconds());
|
|
}
|
|
|
|
private function removeRememberMeCookie()
|
|
{
|
|
unset($_COOKIE[self::REMEMBER_ME_KEY]);
|
|
$this->setCookie(self::REMEMBER_ME_KEY, '', time() - 10);
|
|
}
|
|
|
|
private function setCookie($key, $token, $time)
|
|
{
|
|
setcookie($key, $token, $time, '/', $this->config['root_domain']);
|
|
}
|
|
|
|
private function getLifetimeInSeconds()
|
|
{
|
|
return $this->config['lifetime_in_days'] * 60 * 60 * 24;
|
|
}
|
|
}
|