需求
实现三方OAuth2.0授权登录

使用OAuth服务
OAuth 2.0 Server PHP

环境
nginx
mysql
php

框架
Yii

一 安装

项目目录下安装应用
composer.phar require bshaffer/oauth2-server-php "^1.10"

二 构建数据结构

注意 user表需要自定义

CREATE TABLE oauth_clients (
client_id VARCHAR(80) NOT NULL,
client_secret VARCHAR(80),
redirect_uri VARCHAR(2000),
grant_types VARCHAR(80),
scope VARCHAR(4000),
user_id VARCHAR(80),
PRIMARY KEY (client_id)
); CREATE TABLE oauth_access_tokens (
access_token VARCHAR(40) NOT NULL,
client_id VARCHAR(80) NOT NULL,
user_id VARCHAR(80),
expires TIMESTAMP NOT NULL,
scope VARCHAR(4000),
PRIMARY KEY (access_token)
); CREATE TABLE oauth_authorization_codes (
authorization_code VARCHAR(40) NOT NULL,
client_id VARCHAR(80) NOT NULL,
user_id VARCHAR(80),
redirect_uri VARCHAR(2000),
expires TIMESTAMP NOT NULL,
scope VARCHAR(4000),
id_token VARCHAR(1000),
PRIMARY KEY (authorization_code)
); CREATE TABLE oauth_refresh_tokens (
refresh_token VARCHAR(40) NOT NULL,
client_id VARCHAR(80) NOT NULL,
user_id VARCHAR(80),
expires TIMESTAMP NOT NULL,
scope VARCHAR(4000),
PRIMARY KEY (refresh_token)
); CREATE TABLE oauth_users (
username VARCHAR(80),
password VARCHAR(80),
first_name VARCHAR(80),
last_name VARCHAR(80),
email VARCHAR(80),
email_verified BOOLEAN,
scope VARCHAR(4000),
PRIMARY KEY (username)
); CREATE TABLE oauth_scopes (
scope VARCHAR(80) NOT NULL,
is_default BOOLEAN,
PRIMARY KEY (scope)
); CREATE TABLE oauth_jwt (
client_id VARCHAR(80) NOT NULL,
subject VARCHAR(80),
public_key VARCHAR(2000) NOT NULL
);

三 代码实现

<?php
/**
* Created by PhpStorm.
* User: parker
* Date: 2020/9/8
* Time: 7:08 下午
*
* 使用 OAuth 2.0 Server PHP 搭建三方授权服务
* 相关文档地址 https://bshaffer.github.io/oauth2-server-php-docs/
* 本服务使用 授权码形式
* 授权码(authorization code)方式,指的是第三方应用先申请一个授权码,然后再用该码获取令牌。
* 这种方式是最常用的流程,安全性也最高,它适用于那些有后端的 Web 应用。授权码通过前端传送,令牌则是储存在后端,而且所有与资源服务器的通信都在后端完成。这样的前后端分离,可以避免令牌泄漏。
*
*/ namespace backend\controllers\api; use common\lib\LController;
use common\lib\LError;
use common\models\admin\AdminModel;
use OAuth2\GrantType\AuthorizationCode; use OAuth2\Request;
use OAuth2\Response;
use OAuth2\Server;
use OAuth2\Storage\Pdo;
use yii\helpers\Json;
use Yii; class OauthController extends LController
{ public $enableCsrfValidation = false;
/** @var Pdo $storage */
public $storage;
/** @var Server $server */
public $server;
/** @var Request $request */
public $request;
/** @var Response $response */
public $response; public function init()
{ $this->storage = new Pdo([
'dsn' => 'mysql:host=10.0.80.10;dbname=ylsrc_admin',
'username' => 'root',
'password' => '2Q5@a5X6fh'
], [
'client_table' => 'src_oauth_clients',
'access_token_table' => 'src_oauth_access_tokens',
'refresh_token_table' => 'src_oauth_refresh_tokens',
'code_table' => 'src_oauth_authorization_codes',
'user_table' => 'src_admin',
'scope_table' => 'src_oauth_scopes',
'public_key_table' => 'src_oauth_public_keys',
]);
$this->server = new Server($this->storage);
$this->request = Request::createFromGlobals();
$this->response = new Response();
} /**
* 获取授权码(测试使用生产环境服务添加到登录接口)
*
* 获取链接
* GET http://usrc.com/api/oauth/get-code?response_type=code&client_id=1&state=xyz
* response_type 必填 请求类型
* client_id 必填 三方授权id
* state 必填 回调验证字段
*
* 响应方式为跳转到src_oauth_clients表对应id条目设置的redirect_url跳转连接返回第三方应用, 并且携带code
* 示例:对应的redirect_url为 https://host.com 那么对应的跳转连接为(state未使用)
* https://host.com?code=d53d363349951c29593b722a7d2fb05c054f5e65&state=xyz
*
*/
public function actionGetCode()
{
$uid = Yii::$app->user->id;
if($uid){
$this->server->addGrantType(new AuthorizationCode($this->storage)); // or any grant type you like!
$this->server->validateAuthorizeRequest($this->request, $this->response);
$this->server->handleAuthorizeRequest($this->request, $this->response, true, $uid);
$this->response->send();
}else{
$this->ajaxReturn( LError::NO_PERMISSION, LError::getErrMsgByCode( LError::NO_PERMISSION ), [] );
} } /**
* 获取access_toke
* 获取链接
* POST http://usrc.com/api/oauth/get-token
* data
* grant_type 必填 请求类型 authorization_code
* client_id 必填 三方授权id
* client_secret 必填 三方授权秘钥
* code 必填 上一步获取的授权码
*
* return
*
* {
* "access_token": "b2d91c2764bdde79e4f1e92349b969e8ee031e8a",
* "expires_in": 3600,
* "token_type": "Bearer",
* "scope": null,
* "refresh_token": "d9293e82c22523ad6500d6b584b484cc3aeb4736"
* }
*/
public function actionGetToken()
{
$response = $this->server->handleTokenRequest($this->request);
$response->send();
} /**
* 使用token获取用户信息
* 获取连接
* GET http://usrc.com/api/oauth/get-user-info?access_token=b2d91c2764bdde79e4f1e92349b969e8ee031e8a
*
* access_token 上一步获取的token
*
*/
public function actionGetUserInfo()
{
if (!$this->server->verifyResourceRequest($this->request)) {
$this->server->getResponse()->send();
}else{
$token = $this->server->getAccessTokenData($this->request);
$user = AdminModel::findIdentity($token['user_id']);
$data = [
'id' => $user->id,
'username' => $user->account_name,
'mobile' => $user->mobile,
'email' => $user->email,
]; echo Json::encode($data);
} }
}

参考文献

OAuth2.0 官方文档  https://oauth.net/2/

OAuth 2.0 Server PHP 官方文档 https://bshaffer.github.io/oauth2-server-php-docs/

OAuth2.0的一个简单解释 阮一峰 http://www.ruanyifeng.com/blog/2019/04/oauth_design.html

OAuth2.0的四种方式 阮一峰 http://www.ruanyifeng.com/blog/2019/04/oauth-grant-types.html

 

OAuth 2.0 Server PHP实现示例的更多相关文章

  1. PHP OAuth 2.0 Server

    PHP OAuth 2.0 Server PHP OAuth 2.0 Server ⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️ ...

  2. 每周开源项目分享-年轻人的第一个OAuth2.0 Server:hydra

    年轻人的第一个OAuth2.0 Server:hydra hydra 是什么呢? OpenID Connect certified OAuth2 Server - cloud native, secu ...

  3. Identity Server 4 预备知识 -- OAuth 2.0 简介

    OAuth 2.0 简介 OAuth有一些定义: OAuth 2.0是一个委托协议, 它可以让那些控制资源的人允许某个应用以代表他们来访问他们控制的资源, 注意是代表这些人, 而不是假冒或模仿这些人. ...

  4. 【实例图文详解】OAuth 2.0 for Web Server Applications

    原文链接:http://blog.csdn.net/hjun01/article/details/42032841        OAuth 2.0 for Web Server Applicatio ...

  5. Identity Server 4 原理和实战(完结)_----选看 OAuth 2.0 简介(上)

    https://www.yuque.com/yuejiangliu/dotnet/cg95ni 代表资源所有者的凭据 授权 Authorization Grant 授权是一个代表着资源所有者权限的凭据 ...

  6. ASP.NET WebApi OWIN 实现 OAuth 2.0

    OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用. OAuth 允许用户提供一个令牌, ...

  7. [转]OAuth 2.0 - Authorization Code授权方式详解

    本文转自:http://www.cnblogs.com/highend/archive/2012/07/06/oautn2_authorization_code.html I:OAuth 2.0 开发 ...

  8. oAuth 2.0 笔记

    OAuth 2.0规范于2012年发布,很多大型互联网公司(比如:微信.微博.支付宝)对外提供的SDK中,授权部分基本上都是按这个规范来实现的. OAuth 2.0提供了4种基本的标准授权流程,最为复 ...

  9. NET WebApi OWIN 实现 OAuth 2.0

    NET WebApi OWIN 实现 OAuth 2.0 OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和 ...

随机推荐

  1. HDOJ 1003

    动态规划一直AC不了竟然是因为一厢情愿的多加了一个#! printf("Case #%d:\n",count); --------------------------------- ...

  2. vue 图片路径问题

    图片路径问题 module.exports = { // 根据环境区分 生产服务器production比如php服务器的地址 和 开发服务器dev的地址 // npm run serve是开发环境de ...

  3. ZT:做一个连自己都羡慕的人

    当你越来越杰出时,自然有人关注你, 当你越来越有能力时,自然会有人看得起你, 改变自己,你才有自信,梦想才会慢慢的实现. 做最好的自己,懒可以毁掉一个人,勤可以激发一个人! 不要等夕阳西下的时候才对自 ...

  4. 跨年夜问题:一句并不复杂的delete竟然在delete statement处cost飙升,在数据量上升的十万级就像进入了死循环,执行后久久没有结果

    笔者使用的环境: # 类别 版本 1 操作系统 Win10 2 数据库 Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bi ...

  5. 面试官问我:看过sharding-jdbc的源码吗?我吧啦吧啦说了一通!!

    写在前面 在产品初期快速迭代的过程中,往往为了快速上线而占据市场,在后端开发的过程中往往不会过多的考虑分布式和微服务,往往会将后端服务做成一个单体应用,而数据库也是一样,最初会把所有的业务数据都放到一 ...

  6. Django+bootstrap启动登录模板页面(Django三)

    上次用Django启动了我的第一个页面 具体步骤参考:初步启动DjangoDjango启动第一个页面但是页面非常简陋,所以我从网上找了个模板,下载网址:免费下载模板,解压后内部文件如下: 效果图:下面 ...

  7. css常用属性之display属性

    1.dispaly属性之一:块级标签转行内便签display: inline(内容有多大,就展示多大(用F12看区别)) 2.display属性之二:行内便签转块级标签:diaplay: block ...

  8. Python中的枚举enumerate

  9. Alibaba内部SpringCloud参考笔记,在GitHub一天就标星81.6k?

    前言 阿里巴巴,作为国内互联网公司的Top,算是业界的标杆,有阿里背景的程序员,也更具有权威性.作为程序员,都清楚阿里对于员工要求有多高,技术人员掌握的技术水平更是望尘莫及.所以,大厂程序员的很多经验 ...

  10. idea配置springboot项目记录

    配置文件application.properties server.port=80 server.servlet.context-path=/bookManage spring.mvc.static- ...