You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
163 lines
3.5 KiB
163 lines
3.5 KiB
<?php
|
|
|
|
/*
|
|
|
|
Copyright (c) 2009-2019 F3::Factory/Bong Cosca, All rights reserved.
|
|
|
|
This file is part of the Fat-Free Framework (http://fatfreeframework.com).
|
|
|
|
This is free software: you can redistribute it and/or modify it under the
|
|
terms of the GNU General Public License as published by the Free Software
|
|
Foundation, either version 3 of the License, or later.
|
|
|
|
Fat-Free Framework is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License along
|
|
with Fat-Free Framework. If not, see <http://www.gnu.org/licenses/>.
|
|
|
|
*/
|
|
|
|
namespace Web;
|
|
|
|
//! Lightweight OAuth2 client
|
|
class OAuth2 extends \Magic {
|
|
|
|
protected
|
|
//! Scopes and claims
|
|
$args=[],
|
|
//! Encoding
|
|
$enc_type = PHP_QUERY_RFC1738;
|
|
|
|
/**
|
|
* Return OAuth2 authentication URI
|
|
* @return string
|
|
* @param $endpoint string
|
|
* @param $query bool
|
|
**/
|
|
function uri($endpoint,$query=TRUE) {
|
|
return $endpoint.($query?('?'.
|
|
http_build_query($this->args,null,'&',$this->enc_type)):'');
|
|
}
|
|
|
|
/**
|
|
* Send request to API/token endpoint
|
|
* @return string|FALSE
|
|
* @param $uri string
|
|
* @param $method string
|
|
* @param $token array
|
|
**/
|
|
function request($uri,$method,$token=NULL) {
|
|
$web=\Web::instance();
|
|
$options=[
|
|
'method'=>$method,
|
|
'content'=>http_build_query($this->args,null,'&',$this->enc_type),
|
|
'header'=>['Accept: application/json']
|
|
];
|
|
if ($token)
|
|
array_push($options['header'],'Authorization: Bearer '.$token);
|
|
elseif ($method=='POST' && isset($this->args['client_id']))
|
|
array_push($options['header'],'Authorization: Basic '.
|
|
base64_encode(
|
|
$this->args['client_id'].':'.
|
|
$this->args['client_secret']
|
|
)
|
|
);
|
|
$response=$web->request($uri,$options);
|
|
if ($response['error'])
|
|
user_error($response['error'],E_USER_ERROR);
|
|
if (isset($response['body'])) {
|
|
if (preg_grep('/^Content-Type:.*application\/json/i',
|
|
$response['headers'])) {
|
|
$token=json_decode($response['body'],TRUE);
|
|
if (isset($token['error_description']))
|
|
user_error($token['error_description'],E_USER_ERROR);
|
|
if (isset($token['error']))
|
|
user_error($token['error'],E_USER_ERROR);
|
|
return $token;
|
|
}
|
|
else
|
|
return $response['body'];
|
|
}
|
|
return FALSE;
|
|
}
|
|
|
|
/**
|
|
* Parse JSON Web token
|
|
* @return array
|
|
* @param $token string
|
|
**/
|
|
function jwt($token) {
|
|
return json_decode(
|
|
base64_decode(
|
|
str_replace(['-','_'],['+','/'],explode('.',$token)[1])
|
|
),
|
|
TRUE
|
|
);
|
|
}
|
|
|
|
/**
|
|
* change default url encoding type, i.E. PHP_QUERY_RFC3986
|
|
* @param $type
|
|
*/
|
|
function setEncoding($type) {
|
|
$this->enc_type = $type;
|
|
}
|
|
|
|
/**
|
|
* URL-safe base64 encoding
|
|
* @return array
|
|
* @param $data string
|
|
**/
|
|
function b64url($data) {
|
|
return trim(strtr(base64_encode($data),'+/','-_'),'=');
|
|
}
|
|
|
|
/**
|
|
* Return TRUE if scope/claim exists
|
|
* @return bool
|
|
* @param $key string
|
|
**/
|
|
function exists($key) {
|
|
return isset($this->args[$key]);
|
|
}
|
|
|
|
/**
|
|
* Bind value to scope/claim
|
|
* @return string
|
|
* @param $key string
|
|
* @param $val string
|
|
**/
|
|
function set($key,$val) {
|
|
return $this->args[$key]=$val;
|
|
}
|
|
|
|
/**
|
|
* Return value of scope/claim
|
|
* @return mixed
|
|
* @param $key string
|
|
**/
|
|
function &get($key) {
|
|
if (isset($this->args[$key]))
|
|
$val=&$this->args[$key];
|
|
else
|
|
$val=NULL;
|
|
return $val;
|
|
}
|
|
|
|
/**
|
|
* Remove scope/claim
|
|
* @return NULL
|
|
* @param $key string
|
|
**/
|
|
function clear($key=NULL) {
|
|
if ($key)
|
|
unset($this->args[$key]);
|
|
else
|
|
$this->args=[];
|
|
}
|
|
|
|
}
|
|
|
|
|