资讯专栏INFORMATION COLUMN

关于ThinkPHP5中使用 Auth2 验证的实现

alaege / 1144人阅读

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

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

一、通过composer安装

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

安装完成后,如图:

会出现相关的目录

二、实现授权文件

1) 创建对应的数据表

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

然后找到该位置

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

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

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,说明一下,如图:

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

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

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

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

namespace appcommon;
/**

@author jinyan

@create 20180416

*/
use OAuth2StoragePdo;
use thinkConfig;

class Oauth2
{

/**
 * @Register new Oauth2 apply
 * @param string $action
 * @return boolean|OAuth2Server
 */
function grantTypeOauth2($action=null)
{
    Config::load(APP_PATH."database.php");

    $storage = new Pdo(
        [
            "dsn"      => config("dsn"),
            "username" => config("username"),
            "password" => config("password")
        ]
    );

    $server = new OAuth2Server($storage, array("enforce_state"=>false));
    // Add the "Client Credentials" grant type (it is the simplest of the grant types)
    $server->addGrantType(new OAuth2GrantTypeClientCredentials($storage));
    // Add the "Authorization Code" grant type (this is where the oauth magic happens)
    $server->addGrantType(new OAuth2GrantTypeAuthorizationCode($storage));
    // Add the "User Credentials" grant type (this is where the oauth magic happens)
    $server->addGrantType(new OAuth2GrantTypeUserCredentials($storage));
    return $server;
}

/**
 * @校验token值
 * @param unknown $server
 */
protected function checkApiAuthroize($server)
{
    if (!$server->verifyResourceRequest(OAuth2Request::createFromGlobals())) {
        $server->getResponse()->send();
        exit;
    }
}

}
?>

3) 创建token文件, Access.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(OAuth2Request::createFromGlobals())->send("json", "oauth2_");
}

/**
 * @get access_token
 */
public function access_token()
{
    $this->_token();
}

}
?>

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

request url: http://restful.thinkphp.com/r...

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

请求的参数
{

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

}

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

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

4) 通过 access_token 获取接口数据 ,Sms.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()方法:

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

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


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

有信息返回给我们

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

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

完结。

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/29148.html

相关文章

  • vue调用谷歌授权登录获取用户通讯录实现示例

      vue调用用在很多场景,今天为大家介绍如何用谷歌授权登录获取用户通讯录  当前背景  业务端要求,用户本人填写信息,推荐到朋友,要求可以导出用户谷歌邮箱的通讯录,让用户选择,并且回显到页面 ##步骤  在谷歌开发者平台, 创建一个项目,我的理解是,我们的页面就是这个项目,要由我们的项目,对谷歌发起授权请求,就类似微信小程序,向官方发起授权,请求昵称和头像的这个场景,所以,后面我们的这个项目也要...

    3403771864 评论0 收藏0
  • TP-admin即基于ThinkPHP5拿来即用高性能后台管理系统

    摘要:即基于拿来即用高性能后台管理系统官方文档地址在线体验地址账户密码线上仓库在线地址源代码下载克隆直接下载本地部署运行环境要求建议配置虚拟域名若不清楚,请自行解决之,方便接下来开展你的开发工作。 新版本在线体验地址已经上线,欢迎体验? ---2017-01-14 喜欢就Star,不只是Fork; 想要分享的动机才是驱动力,而技术仅仅是一种方法。 ====================...

    Hydrogen 评论0 收藏0
  • TP-admin即基于ThinkPHP5拿来即用高性能后台管理系统

    摘要:即基于拿来即用高性能后台管理系统官方文档地址在线体验地址账户密码线上仓库在线地址源代码下载克隆直接下载本地部署运行环境要求建议配置虚拟域名若不清楚,请自行解决之,方便接下来开展你的开发工作。 新版本在线体验地址已经上线,欢迎体验? ---2017-01-14 喜欢就Star,不只是Fork; 想要分享的动机才是驱动力,而技术仅仅是一种方法。 ====================...

    Aklman 评论0 收藏0
  • 基于ThinkPHP5拿来即用高性能后台管理系统

    摘要:数据库文件已经上传,安装配置就可以使用简称即基于的后台管理系统官方文档地址在线体验地址账户密码线上仓库在线地址源代码下载克隆直接下载本地部署运行环境要求建议配置虚拟域名若不清楚,请自行解决之,方便接下来开展你的开发工作。 喜欢就Star,不只是Fork; 想要分享的动机才是驱动力,而技术仅仅是一种方法。 数据库文件已经上传,安装配置就可以使用 showImg(https://seg...

    894974231 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<