单点登录

摘要:
安装composerrequiraravel/passet=~4.0注意:1)确保系统安装了unzip、zip和其他命令。2) Authenticationrequired(packagist.phpcomposer.com)问题发生在composer的安装过程中。在composer中修改源。json,repositories.packagist。url=https://packagist.larav

安装

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 数组中加入 LaravelPassportPassportServiceProvider::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

8

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>

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

第三方应用实现登录

1. 申请客户端

10
回调地址 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为上面认证服务器

11
//获取访问令牌 access token 以及向资源服务器请求用户信息
授权后会重定向回调地址

Route::get('/dew/sso', 'SSOController@callback');  //路由文件里添加
php artisan make:controller SSOController //创建文件
<?php
namespace AppHttpControllers;

use AppModelsUser;
use GuzzleHttpClient;
use IlluminateHttpRequest;
use IlluminateSupportFacadesLog;

class SSOController extends Controller
{
    protected $http;
    public function __construct()
    {
        $this->http = new Client();
    }

    /**
     * 获取授权码后的回调URL
     * @param Request $request
     * @return IlluminateHttpRedirectResponse
     */
    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();
    }
}

免责声明:文章转载自《单点登录》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇ERP与EWM集成配置ERP端组织架构(二)Commons-DbUtils下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

第三方应用授权

概述 授权流程 第一步:URL拼接与引导授权 第二步:获取app_auth_code 第三步:使用app_auth_code换取app_auth_token 第四步:代替商户发起请求   概述 商户对第三方应用授权成功之后,第三方应用可以帮助商户完成相应的业务逻辑,比如可以代替商户发起当面付的收单请求; 授权采用标准的OAuth 2.0流程,只...

Jenkins自动触发构建maven多模块项目

一、要求 在一个Spring boot项目中,通过Jenkins来触发构建某单一模块时,其他模块和其余分支不受影响 二、Jenkins配置 1. 安装插件 插件:Generic Webhook Trigger Plugin 2. 配置用户 设置用户token,不然会报403错误 jenkins---> 用户列表----> 具体用户------...

vue.js / nuxt.js 微信公众号判断是否在微信浏览器中打开并授权

首先, 看到这个需求, 应该知道这段代码要放在路由守卫中, 每次路由的变化都要触发这个校验 然后...话不多说, 看代码吧 // afterEach有待商榷, 我觉得beforeEach应该会更好, 是不是刚进项目时, beforeEach有点问题? 我试试后再追加. app.router.afterEach(async (to,from)=>{...

浅谈json web token及应用

Json Web Token (JWT),是一个非常轻巧的规范,这个规范允许在网络应用环境间客户端和服务器间较安全的传递信息。该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源。 在web应用中,我们提供的API接口,通过GET或者...

微信开放平台开发——网页微信扫码登录(OAuth2.0)

1、OAuth2.0 OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用。 允许用户提供一个令牌,而不是用户名和密码来访问他们存放在特定服务提供者的数据。每一个令牌授权一个特定的网站(例如,视频编辑网站)在特定的时段(例如,接下来的2小时内)内...

接口幂等性思路

概念 接口幂等性就是用户对于统一操作发起的一次请求或多次请求的结果是一致的,不会因为多次点击而产生了副作用。 哪些场景需要保证接口的幂等性? 用户多次点击按钮。 用户页面回退再次提交 微服务之间相互调用,由于网络波动卡顿,导致feign触发重试机制。 其他情况... 天然幂等情况 以sql为例: 对于select * from table where...