nmatling
@nmatling
Web

Как настроить аутентификацию сайта Wordpress и стороннего приложения?

Есть приложение, известен ключ приложения и id. Есть сайт на вордпресс (мультисайт).
Как их связать между собой зная выше указанные данные? Под словом "связать", я подразумеваю то, что при регистрации или входе в приложение, сайт делился данными с клиентом (приложением), то есть по сути при регистрации в приложении, ты регистрируешься и на сайте.
Знаю, что используются технологии Oauth и REST API, даже есть пример кода (он ниже), но я не спец, не знаю как использовать, куда вставлять данный код, что менять в нём. Подскажите пожалуйста, у кого есть опыт с интеграциями сайтов WP и приложений, хотя бы на нужную дорожку направьте, чтоб можно было разобраться.
<?php
/** /
error_reporting( E_ALL );
ini_set( 'display_errors', 1 );
ini_set('display_startup_errors', 1);
/**/

session_start();

//	Пример OAuth2 класса для получения и обновления токена для доступа к API на PHP
class ClientOAuth2{
	public $clientId     = ''; // id приложения
	public $clientSecret = ''; // Ключ приложения
	public $redirectUri  = ''; // Адрес, на который будет переадресован пользователь после прохождения авторизации
	
	public $baseUrl     = 'https://app.cmmnt.net/api/'; // заменить на https://app.cmmnt.net/api/
	public $access_token     = false;
	
	function __construct( $clientId, $clientSecret, $redirectUri ){
		
		$this->clientId = $clientId;
		$this->clientSecret = $clientSecret;
		$this->redirectUri = $redirectUri;
		
		$this->access_token = $this->getSessionToken();
		if ( $this->access_token === false ){
			$this->init();
		}
		elseif ( $_SESSION['token']['expiresIn'] < time() ){
			// получаем актуальный токен с использованием refresh_token
			$this->refreshToken();
		}
	}
	
	public function sendRequest($action = '', $method = 'GET', $query = array()){
		$query = http_build_query( $query );
		//$query = json_encode($query, JSON_UNESCAPED_UNICODE);

		// Формирование заголовков запроса
		$header = "Content-type: application/x-www-form-urlencoded"
			.(( $this->access_token !== false ) 
				? "\r\nAuthorization: {$_SESSION['token']['tokenType']} {$this->access_token}"
				: '')
			
		;

		// Выполнение запроса
		$opts    = array(
			'http' =>
				array(
					'method'  => $method,
					'header'  => $header,
					'content' => $query,
				),
			/**/
			'ssl' => array( // FOR TEST
				'allow_self_signed' => true,
				'verify_peer' => false,
				'verify_peer_name' => false,
			),
			/**/
		);
		$context = stream_context_create( $opts );

		if ( !$content = @file_get_contents( $this->baseUrl . $action, false, $context ) ) {
			$error = error_get_last();
			throw new Exception( 'HTTP request failed. Error: ' . $error['message'] );
		}
		
		return json_decode( $content, true );
	}
	
	public function tokenToSession($response){
		// Сохраняем токен в сессии
		$_SESSION['token'] = array(
			'access_token' => $response['access_token'], // OAuth-токен с запрошенными правами или с правами, указанными при регистрации приложения.,
			'refresh_token' => $response['refresh_token'], // Токен, который можно использовать для продления срока жизни соответствующего OAuth-токена.
			'tokenType' => $response['token_type'], // Тип токена //Bearer
			'expiresIn' => time() + $response['expires_in'], // Время жизни токена в секундах.
		);
	}
	
	public function getSessionToken(){
		return (isset($_SESSION['token']) && isset($_SESSION['token']['access_token']) ) 
			? $_SESSION['token']['access_token']
			: false;
	}
	
	public function refreshToken(){
		// получаем актуальный токен с использованием refresh_token
		$response = $this->sendRequest('access_token', 'POST', array(
			'grant_type'    => 'refresh_token',
			'refresh_token' => $_SESSION['token']['refresh_token'],
			'client_id'     => $this->clientId,
			'client_secret' => $this->clientSecret,
		));
		// Если при получении токена произошла ошибка
		if ( isset( $response->error ) ) {
			throw new Exception( 'При получении токена произошла ошибка. Error: ' . $response->error . '. Error description: ' . $response->error_description );
		}
		else{
			// Сохраняем токен в сессии
			$this->tokenToSession($response);
		}
	}
	
	public function init(){
		if ( isset($_GET['code']) ){
			// отправляем POST-запрос с указанием кода подтверждения
			$response = $this->sendRequest('access_token', 'POST', array(
				'grant_type'    => 'authorization_code',
				'code'          => $_GET['code'],
				'client_id'     => $this->clientId,
				'client_secret' => $this->clientSecret,
				
				'redirect_uri'  => $this->redirectUri,
			));
			// Если при получении токена произошла ошибка
			if ( isset( $response->error ) ) {
				throw new Exception( 'При получении токена произошла ошибка. Error: ' . $response->error . '. Error description: ' . $response->error_description );
			}
			else{
				// Сохраняем токен в сессии
				$this->tokenToSession($response);
				$this->access_token = $this->getSessionToken();
				
				if ( isset($_SESSION['redirectToUrl']) ){
					$url = $_SESSION['redirectToUrl'];
					unset( $_SESSION['redirectToUrl'] );
					header("Location: {$url}");
				}
			}
		}
		elseif ( isset( $_GET['error'] ) ) {
			// Если при авторизации произошла ошибка
			throw new Exception( 'При авторизации произошла ошибка. Error: ' . $_GET['error'] . '. Error description: ' . $_GET['error_description'] );
		}
		else{
			$_SESSION['redirectToUrl'] = $_SERVER['REQUEST_URI'];
			// переходим на сервер авторизации
			$url = $this->baseUrl . 'authorize?' . http_build_query(array(
				'client_id'     => $this->clientId,
				'redirect_uri'  => $this->redirectUri,
				'response_type' => 'code',

				// Список необходимых приложению в данный момент прав доступа, разделенных пробелом.
				// Права должны запрашиваться из перечня, определенного при регистрации приложения.
				// Если параметр scope не передан, то токен будет выдан с правами, указанными при регистрации приложения.
				// Параметр позволяет получить токен только с теми правами, которые нужны приложению в данный момент.
				'scope'         => 'profile',
			));
			header("Location: {$url}");
		}
	}
	
}

/*
	id приложения, 
	Ключ приложения, 
	Адрес, на который будет переадресован пользователь после прохождения авторизации
*/
$auth = new ClientOAuth2( '128', '3DABBD811363D0CA894E0C92C0C8D096', 'https://zaskolkovo.ru/test.php');




if ( $auth->access_token ){
	echo 'авторизован<br/>';
	
	// запрос на получение данных пользователя
	$response = $auth->sendRequest('me', 'GET');
	
	echo "Ник: {$response[0]['nickname']}<br/>";
	echo "Имя: {$response[0]['given']}<br/>";

}
else{
	echo 'не авторизован<br/>';
}

?>
  • Вопрос задан
  • 37 просмотров
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы