基于thinkphp5.1框架搭建OAuth2.0服务端

OAuth是用于服务端与客户端授权登录的协议,.0是OAuth的第二个版本,关于.0的基础知识,可以阅读阮一峰的一篇博文,对.0的介绍非常详细,只要理解了.0的授权过程,在自己网站实现.0并不复杂 。
本文将讲解如何基于.1的框架实现.0的服务端 。
1 环境搭建
首先确保你已经搭建好了服务器,并且已经能够正常访问你的服务器 。我的环境Xampp+.1.
2 安装.0 php包
你页根据.0的协议自己去实现代码,但是最快捷最安全最可靠的方法当然是移植第三方.0包 。OAuth官网提供了很多第三方包,详见网站,如下图,因为是基于php语言,因此我选择了PHP下第一个 。
点击PHP会跳入源码下载库,将其下载到电脑即可 。
【基于thinkphp5.1框架搭建OAuth2.0服务端】下载后解压,我们只需要将里面/src/OAuth文件夹整个拷贝到tp5//目录下,就可以自动注册对应的命名空间 。之后我们就可以使用\\...的方式去使用OAuth里面的任何方法 。
3 实现OAuth服务端 3.1 创建数据库
由于我们之前下载的OAuth包有用到很多数据表,所以需要按照其要求创建好数据表,创建代码如下:
CREATE TABLE oauth_clients (client_idVARCHAR(80)NOT NULL,client_secretVARCHAR(80),redirect_uriVARCHAR(2000),grant_typesVARCHAR(80),scopeVARCHAR(4000),user_idVARCHAR(80),PRIMARY KEY (client_id));CREATE TABLE oauth_access_tokens (access_tokenVARCHAR(40)NOT NULL,client_idVARCHAR(80)NOT NULL,user_idVARCHAR(80),expiresTIMESTAMPNOT NULL,scopeVARCHAR(4000),PRIMARY KEY (access_token));CREATE TABLE oauth_authorization_codes (authorization_codeVARCHAR(40)NOT NULL,client_idVARCHAR(80)NOT NULL,user_idVARCHAR(80),redirect_uriVARCHAR(2000),expiresTIMESTAMPNOT NULL,scopeVARCHAR(4000),id_tokenVARCHAR(1000),PRIMARY KEY (authorization_code));CREATE TABLE oauth_refresh_tokens (refresh_tokenVARCHAR(40)NOT NULL,client_idVARCHAR(80)NOT NULL,user_idVARCHAR(80),expiresTIMESTAMPNOT NULL,scopeVARCHAR(4000),PRIMARY KEY (refresh_token));CREATE TABLE oauth_users (usernameVARCHAR(80),passwordVARCHAR(80),first_nameVARCHAR(80),last_nameVARCHAR(80),emailVARCHAR(80),email_verifiedBOOLEAN,scopeVARCHAR(4000));CREATE TABLE oauth_scopes (scopeVARCHAR(80)NOT NULL,is_defaultBOOLEAN,PRIMARY KEY (scope));CREATE TABLE oauth_jwt (client_idVARCHAR(80)NOT NULL,subjectVARCHAR(80),public_keyVARCHAR(2000)NOT NULL);
3.2 创建控制器
需要在tp5//index/下创建一个控制器,命名为OAuth.php,写入以下代码,控制器就创建完成了 。

基于thinkphp5.1框架搭建OAuth2.0服务端

文章插图
3.3 实现
OAuth 2.0的运行流程如下图 。
所以第一步是实现 。
我们在之前创建好的控制器中添加一个函数()
代码如下(注意,需要换成你自己的数据库的名字,下同):
$dsn, 'username' => $username, 'password' => $password));// Pass a storage object or array of storage objects to the OAuth2 server class$server = new \OAuth2\Server($storage);// Add the "Client Credentials" grant type (it is the simplest of the grant types)$server->addGrantType(new \OAuth2\GrantType\ClientCredentials($storage));// Add the "Authorization Code" grant type (this is where the oauth magic happens)$server->addGrantType(new \OAuth2\GrantType\AuthorizationCode($storage));$request = \OAuth2\Request::createFromGlobals();$response = new \OAuth2\Response();// validate the authorize requestif (!$server->validateAuthorizeRequest($request, $response)) {die;}// display an authorization formif (empty($_POST)) {exit('