安装

composer require laravel/passport=~4.0

notes:

1)确保系统安装unzip、zip等命令。

2)composer 安装出现 Authentication required (packagist.phpcomposer.com) 问题,修改composer.json 中的源,repositories.packagist.url = https://packagist.laravel-china.org

注册服务提供者

在config/app.php的providers 数组中加入 Laravel\Passport\PassportServiceProvider::class

迁移数据库

php artisan migrate  //生成用于存储客户端和令牌的数据表

生成加密健

 php artisan passport:install

1、生成oauth-private.key(用于构建认证服务器),oauth-public.key(用于构建资源服务器)

2、oauth_clients数据库生成「个人访问」客户端和「密码授权]两条数据。

配置Passport(参考官方文档)

在Model中,我们需要增加 HasApiTokens class

在AuthServiceProvider中, 增加 "Passport::routes()"

在 auth.php中, 更改 api 认证方式为passport

申请客户端以及私人访问令牌 (两种方式)

1. 命令形式(不方便客户注册)
php artisan passport:client

2. Passport Vue 组件
php artisan vendor:publish --tag=passport-components  //发布 Passport Vue,组件位于resources/assets/js/components下

//注册到resources/assets/js/app.js 文件,记得要放在new Vue上面

Vue.component(
'passport-clients',
require('./components/passport/Clients.vue')
); Vue.component(
'passport-authorized-clients',
require('./components/passport/AuthorizedClients.vue')
); Vue.component(
'passport-personal-access-tokens',
require('./components/passport/PersonalAccessTokens.vue')
);

//编译前端资源

npm install   //此处报错,移步larravel Mix文档
npm run dev

编译后资源放在public/js/app.js下

//组件放入应用模板(记得引入编译后的app.js)

<passport-clients></passport-clients>
<passport-authorized-clients></passport-authorized-clients>
<passport-personal-access-tokens></passport-personal-access-tokens>



以上认证服务器都已经搭建完成

第三方应用实现登录

1. 申请客户端



回调地址 http://third.plat.goods/dew/sso

申请授权码和访问令牌

//获取授权码 code (第一次交互)

$query = http_build_query(array(
'client_id' => 3,
'redirect_uri' => 'http://third.plat.goods/dew/sso', //地址必须为上面的回调地址
'response_type' => 'code', //固定值
'scope' => '',
'state' => urlencode('http://laravel.plat.goods/user') //可以放用户访问的地址。
)); return redirect('http://laravel.plat.goods/oauth/authorize?'.$query); ///laravel.plat.goods为上面认证服务器



//获取访问令牌 access token 以及向资源服务器请求用户信息

授权后会重定向回调地址

Route::get('/dew/sso', 'SSOController@callback');  //路由文件里添加
php artisan make:controller SSOController //创建文件
<?php
namespace App\Http\Controllers; use App\Models\User;
use GuzzleHttp\Client;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log; class SSOController extends Controller
{
protected $http;
public function __construct()
{
$this->http = new Client();
} /**
* 获取授权码后的回调URL
* @param Request $request
* @return \Illuminate\Http\RedirectResponse
*/
public function callback(Request $request)
{ $token = $this->token($request); //第二次交互
$login = $this->login($token);//第三次交互 if($login){ if($request_url = $request->input('state', null)){
$request->session()->put('url.intended', urldecode($request_url));
}
return redirect()->intended(); //跳转到 http://laravel.plat.goods/user
}else{
return redirect()->to('http://laravel.plat.com/home/public/login'); //服务提供商网站必须登录
}
} /**
* 获取access token
* @param $request
* @return array|mixed
*/
protected function token($request)
{
$code = $request->code;
if($code) { try { $response = $this->http->post('http://laravel.plat.goods/oauth/token', [
'form_params' => [
'grant_type' => 'authorization_code', //固定值
'client_id' => 3,
'client_secret' => 'UihXNHoSqohdtQ8Js6Av7AOyk3GBNB9rJziDPaWf',
'redirect_uri' => 'http://third.plat.goods/dew/sso',
'code' => $code,
],
]); $response_data = json_decode((string)$response->getBody(), true); return $response_data;
} catch (\Exception $e) { Log::error('get token by code failed: '.$code.' - '.$e->getMessage().' - '.$e->getTraceAsString()); return [];
}
}else{ return [];
} }
/**
* 通过token获取用户信息,并进行登录操作
* @param $token
* @return bool
*/
protected function login($token)
{
if(empty($token)) return false; $access_token = $token['access_token'];
try { // 资源服务器和认证服务器放在了一起,可以独立。
$response = $this->http->request('GET', 'http://laravel.plat.goods/api/user', [
'headers' => [
'Accept' => 'application/json',
'Authorization' => $token['token_type'] . ' ' . $access_token,
]
]);
$users_body = $response->getBody();
$data = json_decode($users_body, true);
if($data) {
$user = new User($data); //because of employee_id is guarded
$user->setAttribute($user->getKeyName(), $data['employee_id']);
//login user in my system
auth()->login($user, false); return true;
}else{ return false;
}
}catch (\Exception $e){ Log::error('get user failed by access_token:'.$access_token.'|'.$e->getMessage());
return false;
}
}
}

//设置资源文件

Route::middleware('auth:api')->get('/user', 'UserController@user'); //routes/api.php文件中设置
php artisan make:controller UserController //创建文件
class UserController extends Controller
{
public function user(Request $request)
{
return $request->user();
}
}

单点登录 - API 认证系统 Passport(二)的更多相关文章

  1. Laravel 的 API 认证系统 Passport 三部曲(二、passport的具体使用)

    GQ1994 关注 2018.04.20 09:31 字数 1152 阅读 1316评论 0喜欢 1 参考链接 Laravel 的 API 认证系统 Passport 三部曲(一.passport安装 ...

  2. IdentityServer4实现单点登录统一认证

    什么是单点登录统一认证:假如某公司旗下有10个网站(比如各种管理网站:人事系统啊,财务系统啊,业绩系统啊等),我是该公司一管理员或者用户,按照传统网站模式是这样:我打开A网站 输入账号密码 然后进入到 ...

  3. 单点登录CAS使用记(二):部署CAS服务器以及客户端

    CAS-Server下载地址:https://www.apereo.org/projects/cas/download-cas CAS-Client下载地址:http://developer.jasi ...

  4. 身份认证系统(二)多WEB应用的单点登录

    随着互联网的发展,web应用的复杂度也一直在提升,慢慢的单一的web应用已经不能满足复杂的业务需求.例如百度的搜索.新闻.百科.贴吧,其实本质上都是不同的网站.当用户使用这些平台的时候,我们当然不希望 ...

  5. [原创]django+ldap+memcache实现单点登录+统一认证

    前言 由于公司内部的系统越来越多,为了方便用户使用,通过django进行了单点登录和统一认证的尝试,目前实现了django项目的单点登录和非django项目的统一认证,中间波折挺多,涉及的技术包括dj ...

  6. [ Laravel 5.3 文档 ] 安全 ―― API认证(Passport)保障安全性。

    1.简介 Laravel通过传统的登录表单已经让用户认证变得很简单,但是API怎么办?API通常使用token进行认证并且在请求之间不维护session状态.Laravel使用LaravelPassp ...

  7. 单点登录--CAS认证--web.xml配置详解

    参考网址: https://blog.csdn.net/zhurhyme/article/details/29349543 https://blog.csdn.net/shzy1988/article ...

  8. 基于云端的通用权限管理系统,SAAS服务,基于SAAS的权限管理,基于SAAS的单点登录SSO,企业单点登录,企业系统监控,企业授权认证中心

    基于云端的通用权限管理系统 SAAS服务 基于SAAS的权限管理 基于SAAS的单点登录SSO 基于.Net的SSO,单点登录系统,提供SAAS服务 基于Extjs 4.2 的企业信息管理系统 基于E ...

  9. Laravel 5.4建站06--API 认证系统 Passport

    介绍 在 Laravel 中,实现基于传统表单的登陆和授权已经非常简单,但是如何满足 API 场景下的授权需求呢?在 API 场景里通常通过令牌来实现用户授权,而非维护请求之间的 Session 状态 ...

随机推荐

  1. Http协议Content-Length详解

    前言 http协议是互联网中最重要的协议之一,虽然看上去很简单,但是实际中经常遇到问题,我们就已经遇到好几次了.有长连接相关的,有报文解析相关的.对http协议不能一知半解,必须透彻理解才行.本文通过 ...

  2. ORM查询2

    目录 十三式 2式(针对外键查询优化) select_related和prefetch_related prefetch_related 查询返回值类型 不等式查询 关键字查询 时间查询 跨表查询 组 ...

  3. oracle之新建用户与授权

    1.登录,口令为Oracle12c 2.新建用户 3.口令自己设置 4.按下图给角色授权,点击用用 5.登录刚刚创建的用户

  4. C# Foreach循环本质与枚举器

    对于C#里面的Foreach学过 语言的人都知道怎么用,但是其原理相信很多人和我一样都没有去深究.刚回顾泛型讲到枚举器让我联想到了Foreach的实现,所以进行一番探究,有什么不对或者错误的地方大家多 ...

  5. Salesforce学习之路-developer篇(四)Visualforce结合Reports展示图表

    Salesforce作为一款CRM系统,个人觉得最重要的环境便是在于数据的展示和联动,而Salesforce也本身提供了相当强大的功能,Report在展示图表的方面十分强大,前段时间更是宣布以157亿 ...

  6. Centos7升级Git版本

    centos 升级 Git 版本 问题描述 centos7 系统默认的 git 安装版本是 1.8,但是在项目构建中发现 git 版本过低,于是用源码编译的方式进行升级.同时该文章也适用于安装新的 g ...

  7. wwindows权限认识(用户及用户组)

    windows权限认识(用户及用户组) Windows系统内置了许多本地用户组,这些用户组本身都已经被赋予一些权限(permissions),它们具有管理本地计算机或访问本地资源的权限.只要用户账户加 ...

  8. ‎Cocos2d-x 学习笔记(23) 分辨率与屏幕适配

    Cocos2d-x的分辨率可以分为两种:屏幕分辨率和设计分辨率. 屏幕分辨率就是屏幕窗口的大小,单位是像素. 设计分辨率单位是点,一个点可能包括多个像素. 如果把一台显示器自身的分辨率比作屏幕分辨率的 ...

  9. Ubuntu中用户名密码和root密码修改

    用户名密码和root密码不是同一个密码 重置(修改)root密码 ubuntu的root初始密码是随机的,每次开机都有一个新的root密码修改方法如下: 1.sudo passwd root 2.此处 ...

  10. 张高兴的 .NET Core IoT 入门指南:(五)PWM 信号输出

    什么是 PWM 在解释 PWM 之前首先来了解一下电路中信号的概念,其中包括模拟信号和数字信号.模拟信号是一种连续的信号,与连续函数类似,在图形上表现为一条不间断的连续曲线.数字信号为只能取有限个数值 ...