登录  /  注册

OAuth2 基于TP 搭建简单案例

php中文网
发布: 2016-07-29 08:56:22
原创
1417人浏览过

阅读须知:理解oauth2

OAuth是一个关于授权(authorization)的开放网络标准,在全世界得到广泛应用,目前的版本是2.0版。今天就试着把环境搭建一下在此仅作为学习记录;

参考资料来源:

http://oauth.net/2/

http://bshaffer.github.io/oauth2-server-php-docs/cookbook/

数据表准备:

--
-- 表的结构 `oauth_access_tokens`
--

CREATE TABLE IF NOT EXISTS `oauth_access_tokens` (
  `access_token` text,
  `client_id` text,
  `user_id` text,
  `expires` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `scope` text
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- --------------------------------------------------------

--
-- 表的结构 `oauth_authorization_codes`
--

CREATE TABLE IF NOT EXISTS `oauth_authorization_codes` (
  `authorization_code` text,
  `client_id` text,
  `user_id` text,
  `redirect_uri` text,
  `expires` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `scope` text,
  `id_token` text
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- --------------------------------------------------------

--
-- 表的结构 `oauth_clients`
--

CREATE TABLE IF NOT EXISTS `oauth_clients` (
  `client_id` text,
  `client_secret` text,
  `redirect_uri` text
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--
-- 转存表中的数据 `oauth_clients`
--

INSERT INTO `oauth_clients` (`client_id`, `client_secret`, `redirect_uri`) VALUES
('demoapp', 'demopass', 'http://127.0.0.1/tp/index.php');

-- --------------------------------------------------------

--
-- 表的结构 `oauth_public_keys`
--

CREATE TABLE IF NOT EXISTS `oauth_public_keys` (
  `client_id` varchar(80) DEFAULT NULL,
  `public_key` varchar(8000) DEFAULT NULL,
  `private_key` varchar(8000) DEFAULT NULL,
  `encryption_algorithm` varchar(80) DEFAULT 'RS256'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- --------------------------------------------------------

--
-- 表的结构 `oauth_refresh_tokens`
--

CREATE TABLE IF NOT EXISTS `oauth_refresh_tokens` (
  `refresh_token` text,
  `client_id` text,
  `user_id` text,
  `expires` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `scope` text
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- --------------------------------------------------------

--
-- 表的结构 `oauth_scopes`
--

CREATE TABLE IF NOT EXISTS `oauth_scopes` (
  `scope` text,
  `is_default` tinyint(1) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- --------------------------------------------------------

--
-- 表的结构 `oauth_users`
--

CREATE TABLE IF NOT EXISTS `oauth_users` (
  `username` varchar(255) NOT NULL,
  `password` varchar(2000) DEFAULT NULL,
  `first_name` varchar(255) DEFAULT NULL,
  `last_name` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

--
-- Indexes for table `oauth_users`
--
ALTER TABLE `oauth_users`
  ADD PRIMARY KEY (`username`);
登录后复制

OAuth2 库地址:https://github.com/bshaffer/oauth2-server-php

这里我把它放在Vendor/OAuth2里;

授权请求类:

<?php namespace Api\Controller;

class OAuth2Controller extends \Org\OAuth2\Controller
{

    public function __construct()
    {
        parent::__construct();
    }

    public function authorize()
    {

// validate the authorize request
        if (!$this->oauth_server-&gt;validateAuthorizeRequest($this-&gt;oauth_request, $this-&gt;oauth_response)) {
            $this-&gt;oauth_response-&gt;send();
            die;
        }


// print the authorization code if the user has authorized your client
        $this-&gt;oauth_server-&gt;handleAuthorizeRequest($this-&gt;oauth_request, $this-&gt;oauth_response, true);

        // this is only here so that you get to see your code in the cURL request. Otherwise, we'd redirect back to the client
        $code = substr($this-&gt;oauth_response-&gt;getHttpHeader('Location'), strpos($this-&gt;oauth_response-&gt;getHttpHeader('Location'), 'code=') + 5, 40);

        echo json_encode(['code' =&gt; $code]);

        //$this-&gt;oauth_response-&gt;send();
    }

    public function token()
    {
        $this-&gt;oauth_server-&gt;handleTokenRequest(\OAuth2\Request::createFromGlobals())-&gt;send();
    }

}
登录后复制

OAuth2 库的请求封装放在:Org/OAuth2里;

<?php namespace Org\OAuth2;

class Controller
{

    protected $oauth_server;
    protected $oauth_storage;
    protected $oauth_request;
    protected $oauth_response;

    public function __construct()
    {
        // Autoloading (composer is preferred, but for this example let's just do this)
//        require_once(VENDOR_PATH . '/OAuth2/Autoloader.php');
//        \OAuth2\Autoloader::register();
        // $dsn is the Data Source Name for your database, for exmaple "mysql:dbname=my_oauth2_db;host=localhost"
        $this->oauth_storage = new \OAuth2\Storage\Pdo(array('dsn' =&gt; C('DSN'), 'username' =&gt; C('USERNAME'), 'password' =&gt; C('PASSWORD')));

        // Pass a storage object or array of storage objects to the OAuth2 server class
        $this-&gt;oauth_server = new \OAuth2\Server($this-&gt;oauth_storage);

        // Add the "Client Credentials" grant type (it is the simplest of the grant types)
        $this-&gt;oauth_server-&gt;addGrantType(new \OAuth2\GrantType\ClientCredentials($this-&gt;oauth_storage));

        // Add the "Authorization Code" grant type (this is where the oauth magic happens)
        $this-&gt;oauth_server-&gt;addGrantType(new \OAuth2\GrantType\AuthorizationCode($this-&gt;oauth_storage));

        $this-&gt;oauth_request = \OAuth2\Request::createFromGlobals();
        $this-&gt;oauth_response = new \OAuth2\Response();
    }

}


<?php namespace Org\OAuth2;

class Resource extends Controller
{

    protected $tokenData;

    public function __construct()
    {
        parent::__construct();

        // Handle a request to a resource and authenticate the access token
        if (!$this->oauth_server-&gt;verifyResourceRequest(\OAuth2\Request::createFromGlobals())) {
            $this-&gt;oauth_server-&gt;getResponse()-&gt;send();
            die;
        }

        $this-&gt;tokenData = $this-&gt;oauth_server-&gt;getResourceController()-&gt;getToken();
    }

}
登录后复制

测试类:

<?php namespace Api\Controller;

class TestController extends \Org\OAuth2\Resource
{

    public function __construct()
    {
        parent::__construct();
    }

    public function test()
    {
        echo json_encode(array('success' => true, 'message' =&gt; 'You accessed my APIs!'));
    }

    public function getToken()
    {
        echo json_encode(['token' =&gt; $this-&gt;tokenData]);
    }

}
登录后复制

配置文件:

require_once(VENDOR_PATH . '/OAuth2/Autoloader.php');
OAuth2\Autoloader::register();
return array(
    //'配置项'=&gt;'配置值'
    'AUTOLOAD_NAMESPACE' =&gt; array('OAuth2' =&gt; VENDOR_PATH . 'OAuth2/'), //扩展模块列表
    'DSN' =&gt; 'mysql:host=localhost;dbname=oauth2',
    'USERNAME' =&gt; 'root',
    'PASSWORD' =&gt; '',
);
登录后复制

以上就介绍了OAuth2 基于TP 搭建简单案例,包括了方面的内容,希望对PHP教程有兴趣的朋友有所帮助。

智能AI问答
PHP中文网智能助手能迅速回答你的编程问题,提供实时的代码和解决方案,帮助你解决各种难题。不仅如此,它还能提供编程资源和学习指导,帮助你快速提升编程技能。无论你是初学者还是专业人士,AI智能助手都能成为你的可靠助手,助力你在编程领域取得更大的成就。
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
关于CSS思维导图的课件在哪? 课件
凡人来自于2024-04-16 10:10:18
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2024 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号