单点登录设计方案介绍及用OAuth完整实现一个单点登录系统

news2024/12/22 22:20:52

文章目录

  • 一、单点登录系统的意义
    • 1.1 提高用户体验
    • 1.2 提高安全性
    • 1.3 降低开发成本
    • 1.4 提高操作效率
  • 二、单点登录的实现方式
    • 2.1 基于共享cookie的方式
    • 2.2 基于代理服务器的方式
    • 2.3 基于SAML协议的方式
    • 2.4 基于OAuth协议的方式
  • 三、用OAuth实现单点登录
    • 3.1 OAuth 2.0 协议简介
    • 3.2 OAuth 2.0协议授权流程
    • 3.3 实现步骤
      • 3.2.1 创建认证服务器
      • 3.3.2 创建客户端应用
      • 3.3.3 实现资源服务器
      • 3.3.4 实现单点登录
    • 3.4 代码实现
  • 总结


一、单点登录系统的意义

单点登录系统的应用非常广泛,例如我们在阿里系的各种系统下面,如支付宝,淘宝、阿里云,登录了淘宝,再去阿里云控制台,无需二次登录。这就是典型的单点登录系统。

一般主流的有设计单点登录的平台,都有独立的单点登录域名和系统。比如下面是京东的登录页面。

在这里插入图片描述
单点登录之所以会被广泛使用,主要是有如下特点。

1.1 提高用户体验

用户可以更快速、方便地访问多个应用程序,不用频繁登录和输入多个帐号密码。

1.2 提高安全性

通过统一身份认证和授权,可以避免用户使用弱密码或重复密码,降低帐号被盗的风险。同时,SSO还可以实现集中管理用户权限、认证请求及安全策略,提高整体系统的安全性。

1.3 降低开发成本

采用SSO,可以降低多个应用程序的开发成本,减少维护工作量。

1.4 提高操作效率

对于企业内部的员工,SSO可以缩减操作步骤、简化工作流程,提高工作效率。

二、单点登录的实现方式

单点登录(Single Sign-On,简称SSO)是一种用户只需登录一次,就可以访问多个应用系统的身份认证技术。目前主流被经过验证的一些方式如下。

2.1 基于共享cookie的方式

将用户登录信息存储在一个共享cookie中,在用户跳转到不同的应用系统时,可以直接从共享cookie中获取用户的登录信息。
在这里插入图片描述

2.2 基于代理服务器的方式

在应用系统和用户之间增加一个代理服务器,当用户登录后,代理服务器会为用户生成一个令牌,用户访问其他应用系统时,需要携带该令牌,代理服务器会验证令牌的有效性,从而实现单点登录。

2.3 基于SAML协议的方式

SAML是一种基于XML的标准,用于安全地交换身份验证和授权数据。在该方式中,用户在登录时会被重定向到身份提供者,完成身份认证后,身份提供者会向服务提供者发送SAML断言,服务提供者通过断言验证用户身份,从而实现单点登录。

2.4 基于OAuth协议的方式

OAuth是一种授权框架,用于允许第三方应用程序访问用户资源。在该方式中,用户在登录时会被重定向到身份提供者,完成身份认证后,身份提供者会向应用程序颁发一个访问令牌,用户在访问其他应用程序时,需要携带该令牌,从而实现单点登录。
在这里插入图片描述

三、用OAuth实现单点登录

OAuth是使用最普遍的单点登录解决方案,下面就主要就这种登录方式进行讲解。

3.1 OAuth 2.0 协议简介

OAuth是一个授权协议,由雅虎和谷歌公司等组织提出并得到了很多互联网公司的支持和广泛应用。OAuth允许用户授权第三方应用访问他们存储在另外服务提供者上的信息,这样用户就不需要向第三方应用公开自己的密码等私人信息。

OAuth 2.0 是OAuth最新的版本,它被设计成适用于移动设备和云计算环境,并且易于实现。OAuth 2.0 授权流程的参与者包括用户(端点用户)、客户端应用程序(第三方应用程序)、资源所有者(受保护的资源的用户)和授权服务器。

在这里插入图片描述

OAuth实现单点登录主要分为以下几个步骤:

  1. 用户在资源服务器的网站上登录。也就是说,用户在某个网站里输入用户名和密码,资源服务器验证后,生成一个Authorization Code。
  2. 用户点击了想访问的服务端应用,然后浏览器将用户重定向到认证服务器,并把Authorization Code传递给了认证服务器。
  3. 认证服务器根据Authorization Code生成access token,并返回给浏览器。
  4. 浏览器携带access token跳转到服务端应用,然后服务端应用根据access token获取用户的信息,完成单点登录。

下面是OAuth 2.0授权流程的通用流程图:

3.2 OAuth 2.0协议授权流程

OAuth 2.0 协议授权流程包括以下步骤:

  1. 用户打开客户端应用
  2. 客户端应用向认证服务器请求授权
  3. 用户同意授权
  4. 认证服务器生成access token并返回给客户端应用
  5. 客户端应用携带access token访问资源服务器
  6. 资源服务器返回相应的资源

在这里插入图片描述

3.3 实现步骤

3.2.1 创建认证服务器

首先需要创建一个OAuth认证服务器,来完成用户登录及Token的颁发。可以使用现成的第三方OAuth认证服务器或者自己搭建。本文使用thephpleague/oauth2-server来搭建OAuth认证服务器。

composer require league/oauth2-server

创建OAuth认证服务器,需要实现以下接口:

  1. ClientCredentialsGrantInterface:客户端凭证授权模式
  2. ImplicitGrantInterface:隐式授权模式
  3. ResourceOwnerPasswordCredentialsGrantInterface:密码授权模式
  4. RefreshTokenGrantInterface:刷新令牌授权模式
  5. AccessTokenInterface:AccessToken数据处理
  6. AuthorizationServerInterface:OAuth认证服务器
  7. ResourceServerInterface:OAuth资源服务器

在创建OAuth认证服务器时,需要将这些接口都实现,才能完成OAuth认证服务器的创建。

3.3.2 创建客户端应用

在OAuth认证服务器与资源服务器之间,需要通过客户端应用来实现单点登录流程中的授权与认证。客户端应用需要和OAuth认证服务器进行注册,并且需要得到授权服务器颁发给它的client id与secret,用于后续的授权流程。

实现OAuth 2.0客户端应用的步骤:

  1. 认证服务器创建客户端
  2. 客户端应用获取认证服务器颁发的client_id和client_secret
  3. 客户端应用通过client_id和client_secret向认证服务器请求access token和refresh token

3.3.3 实现资源服务器

在OAuth协议中,资源服务器需要具备以下几个功能:

  1. 接收客户端请求并检验access token的有效性
  2. 返回对应的用户资源
  3. 刷新access token

因此,需要在资源服务器上实现相应的接口,来满足以上几个功能。

实现OAuth 2.0资源服务器的步骤:

  1. 资源服务器通过client_id和client_secret向认证服务器请求access token
  2. 资源服务器获取到access token后,通过access token向认证服务器请求用户信息
  3. 认证服务器返回用户信息给资源服务器
  4. 资源服务器接收到认证服务器返回的用户信息之后,进行相应的业务操作
  5. 资源服务器刷新access token

3.3.4 实现单点登录

在单点登录流程中,应用程序需要进行如下处理:

  1. 从认证服务器获取access token
  2. 使用access token在资源服务器上进行验证
  3. 如果access token无效,从认证服务器重新获取access token
  4. 重复步骤2

在PHP中,可以使用thephpleague/oauth2-client来获取access token,然后通过access token来访问资源服务器。

composer require league/oauth2-client

在获取access token之后,需要将access token缓存起来,当下一次访问资源服务器时,如果access token还未过期,则可以直接使用,否则需重新从认证服务器获取access token。

3.4 代码实现

单点登录(SSO)是一种身份验证机制,允许用户使用一个集中的登录凭据来访问多个应用程序。OAuth2是一个广泛使用的授权框架,可以用于实现单点登录。

以下是使用PHP oauth2-client库实现单点登录的步骤:

  1. 创建一个OAuth2客户端实例:
$provider = new League\OAuth2\Client\Provider\GenericProvider([
    'clientId'                => '{clientId}',
    'clientSecret'            => '{clientSecret}',
    'redirectUri'             => '{redirectUri}',
    'urlAuthorize'            => '{urlAuthorize}',
    'urlAccessToken'          => '{urlAccessToken}',
    'urlResourceOwnerDetails' => '{urlResourceOwnerDetails}'
]);

在这里,我们需要提供OAuth2客户端的参数,包括clientId、clientSecret、redirectUri等。

  1. 在客户端应用程序中创建一个登录链接:
$authorizationUrl = $provider->getAuthorizationUrl();
$_SESSION['oauth2state'] = $provider->getState();
header('Location: ' . $authorizationUrl);
exit;

这将重定向用户到OAuth2提供者的授权页面,要求用户提供其凭据以进行身份验证。

  1. 处理授权回调:
if (isset($_GET['code']) && isset($_GET['state']) && isset($_SESSION['oauth2state'])) {
    if ($_SESSION['oauth2state'] !== $_GET['state']) {
        exit('Invalid state');
    }
    try {
        $accessToken = $provider->getAccessToken('authorization_code', [
            'code' => $_GET['code']
        ]);

        // Use this to interact with an API on the users behalf
        echo $accessToken->getToken();
    } catch (\League\OAuth2\Client\Provider\Exception\IdentityProviderException $e) {
        exit('Failed to get access token');
    }

} else {
    exit('Invalid callback request');
}

在回调中,我们需要检查state参数以防止CSRF攻击。然后,我们使用提供者返回的授权代码获取访问令牌。一旦我们有了访问令牌,我们可以在用户的名义下与API进行交互。

  1. 在受保护的应用程序中使用访问令牌进行身份验证:
$accessToken = new League\OAuth2\Client\Token\AccessToken([
    'access_token' => '{access_token}'
]);

// Make a call to the API using the access token
$result = $provider->getHttpClient()->get('{api_endpoint}', [
    'headers' => [
        'Authorization' => 'Bearer ' . $accessToken->getToken()
    ]
]);

在这里,我们使用访问令牌进行身份验证,在请求中添加“Authorization”头并将访问令牌作为Bearer标记发送。

总结

以上就是今天讲解的内容,单点登录设计方案介绍及用OAuth完整实现一个单点登录系统。本文从单点登录有哪些实现方案出发分析,到用OAuth方式是如何实现一个单点登录的这一套流程进行了一个完整的讲述。有疑问欢迎评论或者私信。感谢大家。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/674714.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【计组】微指令 微操作 微命令 微程序

区分四个概念 (1)微命令:微命令是构成控制信号序列的最小单位。通常是指那些直接作用于部件或控制门电路的控制命令。 (2)微操作:由微命令控制实现的最基本的操作称为微操作。 (3)微指令:以产生一组微命令&…

ubuntu20.4服务器安装mysql社区版并开放3306端口

您可以按照以下步骤在Ubuntu上安装MySQL社区版: 更新软件包列表: sudo apt-get update下载MySQL社区版的APT存储库配置文件: wget https://dev.mysql.com/get/mysql-apt-config_0.8.19-1_all.deb安装APT存储库配置文件: sudo …

Python基础篇(三):基本语句的示例和说明

基本语句的示例和说明 前言1. 赋值语句2. 条件语句3. 循环语句3.1 for循环示例3.2 while循环示例 4. 函数定义语句5. 函数调用语句6. 异常处理语句7. 导入语句 前言 本文是Python中常见基本语句的示例和说明。这些语句是构建Python程序逻辑和控制流的基础,可以根据…

【T+】畅捷通T+直接升级后,原端口无法使用提示端口占用。

【问题描述】 在使用畅捷通T软件过程中,由于软件可以直接升级, 即:原软件是T16.0版本,可以直接运行T18.0的程序进行软件、数据升级。无需将16.0进行卸载,再安装18.0进行数据升级。 但这样直接升级后,原来的…

Shell编程从入门到实践——入门篇

欢迎关注 「Android茶话会」 回 「学习之路」 取Android技术路线经典电子书回 「pdf」 取阿里&字节经典面试题、Android、算法、Java等系列武功秘籍。回 「天涯」 取天涯论坛200精彩博文,包括小说、玄学等 Shell是一种命令行解释器,它是在Unix和Linux操作系统中…

强化历程3-JavaWeb及Spring,SpringMVC,SpringBoot系列(2023.6.22)

文章目录 强化历程3-JavaWeb及SSM,SpringBoot系列(2023.6.22第一次更新)习题汇总1 JSP页面内容组成?2 cookie和session的区别?3 web应用中如何利用session来维持客户端和服务端的关系?4 session销毁的方式?5 请求转发和重定向的区别?6 什么是servelt&#xff1f…

基于Web的数字家庭网站设计与实现【附开题报告和万字文档(Lun文)】

主要功能 前台登录: ①主页:新闻信息展示、最新动态、家庭亲子视频展示、亲友动态展示 ②论坛:发布帖子 ③家庭亲自视频:视频类型分类、亲子视频标题 ④家庭日记:日记类型分类、日记标题 ⑤新闻信息:新闻类…

vue3+vite+js+router+vueX+组件一键导入(源码)

一、前言 一直想自己做一个简单脚手架,方便自己做点简单的demo网上开源也找不到,大多数都是太重了,或者又太轻了今天把这个几个都揉在一起,方便后面做点小玩意 二、项目包 vite-project.zip - 蓝奏云文件大小:8.8 M|ht…

SCTF2023 Barter 复现

题目描述: chal_sage部分: from Crypto.Util.number import * from random import * from secrets import flagdef gen_random(seed, P, Q, r_list, times):s seedfor i in range(times):s int((s * P)[0])r int((s * Q)[0])r_list.append(r)return…

E. Round Dance(dfs分辨特殊联通块)

Problem - 1833E - Codeforces 有 n 个人来到一个节日并决定跳几个“圆舞”。每个圆舞至少有 2 个人,且每个人恰好有两个邻居。如果圆舞中只有 2 个人,则它们在两侧拥有相同的邻居。 你想要确定有多少个“圆舞”可以跳。但是每个参与者只记得一个邻居。…

【自注意力机制必学】BERT类预训练语言模型(含Python实例)

BERT类预训练语言模型 文章目录 BERT类预训练语言模型1. BERT简介1.1 BERT简介及特点1.2 传统方法和预训练方法1.3 BERT的性质 2. BERT结构2.1 输入层以及位置编码2.2 Transformer编码器层2.3 前馈神经网络层2.4 残差连接层2.5 输出层 3. BERT类模型简要笔记4. 代码工程实践 1.…

利用python绘制端午节的各种图案,例如粽子,赛龙舟等,以及一些端午节的感人小故事

这里写目录标题 1、关于端午节的有趣故事2、关于端午节的趣闻3、利用python绘制龙舟3.1. 代码如下3.2 图形展示 4、利用python绘制大公鸡5、利用python来进行端午节的诗词对弈总结 1、关于端午节的有趣故事 端午节是一个历史悠久的中国传统节日,有很多有趣的故事与…

内存不够用,那你的内存去哪了?

一、前言 近几年开发了一些大型的应用程序,在程序性能调优或者解决一些疑难杂症问题的过程中,遇到最多的还是与内存相关的一些问题。例如glibc内存分配器ptmalloc,google的内存分配器tcmalloc都存在“内存泄漏”,即内存不归还操作…

原来Flutter代码是这样运行在原生系统的!快来了解Flutter标准模板,感受原生系统中Flutter的魅力!

通过Android Studio创建的Flutter应用模板,了解Flutter项目结构,分析Flutter工程与原生Android和iOS工程有哪些联系,体验一个有着基本功能的Flutter应用是如何运转的,从而加深你对构建Flutter应用的关键概念和技术的理解。 Dart只…

深入理解深度学习——GPT(Generative Pre-Trained Transformer):GPT-2与Zero-shot Learning

分类目录:《深入理解深度学习》总目录 相关文章: GPT(Generative Pre-Trained Transformer):基础知识 GPT(Generative Pre-Trained Transformer):在不同任务中使用GPT GPT&#x…

软考:软件工程:软件维护与项目管理

软考:软件工程:软件维护与管理 提示:系列被面试官问的问题,我自己当时不会,所以下来自己复盘一下,认真学习和总结,以应对未来更多的可能性 关于互联网大厂的笔试面试,都是需要细心准备的 &…

如何挑选合格的在线教育解决方案?

现在市面上的知识付费系统繁多,你可以说百花齐放,也可以说良莠不齐,如果不具备一定的专业素养,根本就无法从中挑选出真正的好产品,劣币驱逐良币反而成为常态。 本文将从几个常见维度分析一个好产品应该具备的基本要素…

CSS基础总结

CSS基础总结 CSS基础总结基础认知基础选择器**选择器的作用**标签选择器类选择器id选择器**通配符选择器** 字体和文本样式字体样式字体大小:font-size字体粗细:font-weight字体样式:font-style字体类型:font-family字体类型&…

【MYSQL篇】mysql性能优化总结

前言 说到MYSQL性能调优,大部分时候想要实现的目标是让我们的查询更快。一个查询的动作又是由很多个环节组成的,每个环节都会消耗时间,我们要减少查询所消耗的时间,就要从每一个环节入手。 关于MYSQL的sql语句执行流程&#xff0…