博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
关于ThinkPHP5中使用 Auth2 验证的实现
阅读量:7230 次
发布时间:2019-06-29

本文共 5445 字,大约阅读时间需要 18 分钟。

在tp上实现的auth2验证的,在网上发现笔记很少, 不像yii, 故在此发表一下笔记,用来帮助有相关需求的朋友

PS: 鉴于oauth2有四种方案, 本实例是基于 客户端凭证 实现,其他三种就不讲述了

一、通过composer安装

composer require --prefer-dist bshaffer/oauth2-server-php

安装完成后,如图:

clipboard.png
会出现相关的目录

二、实现授权文件

1) 创建对应的数据表

首先找到 Pdo.php文件,如图:

clipboard.png

然后找到该位置

clipboard.png

目的,是告诉你创建表时的名称,应该和这里使用的表名称一致

关于创建的表,我直接上代码,方便各位可以直接复制粘贴:

CREATE TABLE oauth_access_tokens (

access_token varchar(40) NOT NULL,
client_id varchar(80) NOT NULL,
user_id int(11) DEFAULT NULL,
expires varchar(19) NOT NULL,
scope text,
PRIMARY KEY (access_token),
KEY fk_access_token_oauth2_client_client_id (client_id),
KEY ix_access_token_expires (expires),
CONSTRAINT fk_access_token_oauth2_client_client_id FOREIGN KEY (client_id) REFERENCES pos_oauth2_client (client_id) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE oauth_authorization_codes (

authorization_code varchar(40) NOT NULL,
client_id varchar(80) NOT NULL,
user_id int(11) DEFAULT NULL,
redirect_uri text NOT NULL,
expires int(11) NOT NULL,
scope text,
PRIMARY KEY (authorization_code),
KEY fk_authorization_code_oauth2_client_client_id (client_id),
KEY ix_authorization_code_expires (expires),
CONSTRAINT fk_authorization_code_oauth2_client_client_id FOREIGN KEY (client_id) REFERENCES pos_oauth2_client (client_id) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE oauth_clients (

client_id varchar(80) NOT NULL,
client_secret varchar(80) NOT NULL,
redirect_uri text NOT NULL,
grant_type text,
scope text,
created_at int(11) DEFAULT NULL,
updated_at int(11) DEFAULT NULL,
created_by int(11) DEFAULT NULL,
updated_by int(11) DEFAULT NULL,
PRIMARY KEY (client_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE oauth_refresh_tokens (

refresh_token varchar(40) NOT NULL,
client_id varchar(80) NOT NULL,
user_id int(11) DEFAULT NULL,
expires int(11) NOT NULL,
scope text,
PRIMARY KEY (refresh_token),
KEY fk_refresh_token_oauth2_client_client_id (client_id),
KEY ix_refresh_token_expires (expires),
CONSTRAINT fk_refresh_token_oauth2_client_client_id FOREIGN KEY (client_id) REFERENCES pos_oauth2_client (client_id) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE oauth_scopes (

scope text,
is_default tinyint(1) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

添加一条数据

insert into oauth_clients(client_id,client_secret,redirect_uri,grant_type,scope,created_at,updated_at,created_by,updated_by) values ('admin','123456','http://','client_credentials',NULL,NULL,NULL,NULL,NULL);

PS,说明一下,如图:

clipboard.png

在我实际使用中,只使用到这五张表,也就是上面创建的五张表,在这个config里面,剩下的几个选项我是全部 注销掉了的

另外还有一个情况,说明一下: 有可能各位,对数据表设置了表前缀, 也是需要在此进行相关修改的, 比如我创建的,见图:

clipboard.png

所以我进行了相关的修改:

clipboard.png

2) 创建授权文件 Oauth2.php, 名字随便自己取

<?php

namespace appcommon;
/**

  • @author jinyan
  • @create 20180416

*/

use OAuth2StoragePdo;
use thinkConfig;

class Oauth2

{

/** * @Register new Oauth2 apply * @param string $action * @return boolean|\OAuth2\Server */function grantTypeOauth2($action=null){    Config::load(APP_PATH.'database.php');    $storage = new Pdo(        [            'dsn'      => config('dsn'),            'username' => config('username'),            'password' => config('password')        ]    );    $server = new \OAuth2\Server($storage, array('enforce_state'=>false));    // 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));    // Add the "User Credentials" grant type (this is where the oauth magic happens)    $server->addGrantType(new \OAuth2\GrantType\UserCredentials($storage));    return $server;}/** * @校验token值 * @param unknown $server */protected function checkApiAuthroize($server){    if (!$server->verifyResourceRequest(\OAuth2\Request::createFromGlobals())) {        $server->getResponse()->send();        exit;    }}

}

?>

3) 创建token文件, Access.php

<?php

namespace apprestfulcontroller;
use appcommonOauth2;

/**

  • @uathor:jinyan

*/

class Access extends Oauth2

{

protected  $_server;/** * @授权配置 */public function __construct(){    return $this->_server = $this->grantTypeOauth2();}/** * */private function _token(){    // Handle a request for an OAuth2.0 Access Token and send the response to the client    $this->_server->handleTokenRequest(\OAuth2\Request::createFromGlobals())->send('json', 'oauth2_');}/** * @get access_token */public function access_token(){    $this->_token();}

}

?>

那么如何请求一个access_token的值呢? 直接调用这个 acccess_token()的方法即可

request url:

还请得之前创建数据表时,有添加了一条新数据吗? 其作用就是相当于用来获取access_token的账号密码之类的, 记得需要使用 Post方式获取token

请求的参数

{

client_id=adminclient_secret=123456grant_type=client_credentials //这个参数是固定的

}

如果请求成功的话,会返回如下图所示:

clipboard.png

贴上,通过ff浏览器httprequest的请求界面:

clipboard.png

4) 通过 access_token 获取接口数据 ,Sms.php

<?php

namespace apprestfulcontroller;
/**

  • Created by PhpStorm.
  • User: Administrator
  • Date: 2018/7/29
  • Time: 22:02

*/

use appcommonOauth2;

class Sms extends Oauth2

{

protected $_server;/** * @授权配置 */public function __construct(){    $this->_server = $this->grantTypeOauth2();}public function test(){    //access_token验证    $this->checkApiAuthroize($this->_server);    echo '成功请求到数据';}

}

三、 测试效果如图:

1)首先不带access_token请求, test()方法:

clipboard.png

结果出现一个401未验证通过的状态

2)然后请求一个错误的access_token, test()方法

clipboard.png

同样是一个401的状态,但此时,如图

clipboard.png

有信息返回给我们

3) 最后,使用一个正确的access_token, test()方法

clipboard.png

所以,基于第1种情况和第2种情况,你应该自定一个token未验证成功的方法,如图:

clipboard.png

clipboard.png

clipboard.png

clipboard.png

完结。

如有疑问需解答, 请加学习群 2751786, 谢谢

转载地址:http://czvfm.baihongyu.com/

你可能感兴趣的文章
css3基本属性
查看>>
PEB结构学习
查看>>
python之属性描述符与属性查找规则
查看>>
linux之各目录作用
查看>>
海淀、西城、东城各类小学排名(转载)
查看>>
AbstractFactory抽象工厂模式(创建型模式)
查看>>
Flex3 + Spring配置
查看>>
Android牟利之道(四)--如何推广你的产品,即你的APP
查看>>
Android的各种Drawable讲解
查看>>
java学习笔记9.20
查看>>
如何防止在同一台机器上重复登录(WinForm程序)
查看>>
使用Fiddler调试Wcf Rest
查看>>
XSLD 简单小例子
查看>>
数组去重
查看>>
安装和部署Jenkins
查看>>
cs231n 17-18 assignment2 出现 No module named 'past' 解决方法
查看>>
Ajax基础
查看>>
全面理解 git
查看>>
Activiti Modeler初探实践
查看>>
NET Core Kestrel部署HTTPS使用SSL证书
查看>>