基于flask-oidc的OIDC协议授权码模式单点登录SSO实现

这篇具有很好参考价值的文章主要介绍了基于flask-oidc的OIDC协议授权码模式单点登录SSO实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

关于SSO单点登录、OIDC协议、授权码模式等相关概念详见基于OIDC的SSO单点登录文章内容

安装flask-oidc

pip install flask-oidc

flask-oidc实现OIDC的授权码模式流程

  • 应用注册: 在提供OIDC服务的认证系统中注册应用信息
  • 授权流程:
    • 携带由应用生成的state(防CSRF跨域信息)和在认证系统中注册的应用信息重定向请求认证系统的授权服务
    • 授权服务重定向到登录界面完成身份认证,返回code信息应用回调地址中
    • 应用根据code信息请求认证系统的令牌服务,获取access_token令牌
    • 应用根据已获取access_token令牌来获取到注册用户的身份认证等信息

代码实现

依赖库安装

pip instal flask-oidc2

flask-oidc认证配置

  • 添加oidc_client_secrets.json文件
    • oidc_client_secrets.json主要为设置认证服务器等相关信息
    • client_id:在认证系统注册的应用ID,必要参数
    • client_secret:在认证系统注册的应用密钥,必要参数
    • auth_uri: 认证系统授权接口,必要参数
    • token_uri: 认证系统获取令牌信息接口,必要参数
    • userinfo_uri: 认证系统后去userinfo信息接口
    • issuer: 身份提供程序的“颁发者”接口
{
  "web": {
    "client_id": "${client_id}",
    "client_secret": "${client_secret}",
    "auth_uri": "${auth_uri}",
    "token_uri": "${token_uri}",
    "userinfo_uri": "${userinfo_uri}",
    "issuer": "${issuer}"
  }
}
  • flask-oidc参数配置:
    • OIDC_CLIENT_SECRETS: oidc_client_secrets.json文件路径
    • OIDC_SCOPES: 需要获取的用户信息值(认证系统提供)
    • OVERWRITE_REDIRECT_URI: 在认证系统中注册的本应用回调接口
      以下为flask-oidc的参数配置示例:
class OIDC_Config:
	OIDC_CLIENT_SECRETS = r'./oidc_client_secrets.json'
	OIDC_SCOPES = ['openid', 'email', 'profile']
	OVERWRITE_REDIRECT_URI = "${your_domain}/api/sso"
  • flask-oidc初始化
# flask导入参数
app.config.from_object(OIDC_Config)

# flask-oidc获取flask关于OIDC的相关参数配置
from flask_oidc import OpenIDConnect

oidc = OpenIDConnect()
oidc.init_app(app)

获取授权码

flask-oidck库实现的require_login装饰器可以根据当前的参数信息,自动前往配置的${auth_uri}请求授权。require_login装饰器会自动生成state携带应用信息作为参数请求${auth_uri}。当${auth_uri}的返回类型response_type类型为id_token时完成授权认证操作。认证服务器执行完后,返回应用系统回调地址。

@oidc.require_login
@app.route('/api/sso')
def sso_login():
	return 'SSO Login'

兑换token令牌

在授权码模式下,调用require_login装饰器,认证系统会返回防止跨域的state信息和授权码code。授权码code作为中间参数,并不携带我们希望获得的用户信息,无法完成登录操作。flask-oidc无法自动根据code获取toekn,所以我们需要手动发起请求获取token令牌。

其中,请求参数应设置为"Content-Type": "application/x-www-form-urlencoded",并且对参数使用urlencode()方法进行编码,否则认证系统可能无法识别参数信息。文章来源地址https://www.toymoban.com/news/detail-535304.html

import json
import requests
from urllib.parse import urlencode

@oidc.require_login
@app.route('/api/sso')
def sso_login(code, state):
	logger.info(f"SSO Login: code: {code}, state: {state}")

	# 使用code向授权服务器发送请求换取token
    headers = {
    	"Accept": "*/*",
    	"Content-Type": "application/x-www-form-urlencoded"
    }

    payload = urlencode({
    	"client_id": oidc.flow.client_id,
    	"client_secret": oidc.flow.client_secret,
    	"grant_type": "authorization_code",
    	"redirect_uri": current_app.config['OVERWRITE_REDIRECT_URI'],
    	"code": code
    })

	# 获取授权token
    token_response = json.loads(requests.request("POST", oidc.flow.token_uri, headers=headers, data=payload).text)

	# 登录
    oidc.set_cookie_id_token(token_response['id_token'])
    # 获取username
    username = oidc.user_getfield('email', access_token=token_response['access_token']).split('@')[0]
    logger.info(f'sso login, username: {username}')
	return 'SSO Login'

到了这里,关于基于flask-oidc的OIDC协议授权码模式单点登录SSO实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SSO、CAS、OAuth、OIDC

    参考 简单了解概念: https://www.bilibili.com/video/BV1XG411w7DN/ 简单了解操作: https://www.bilibili.com/video/BV1334y11739/ openid-connect 👍流程图解: https://www.youtube.com/watch?v=t18YB3xDfXI (图:https://developer.okta.com/blog/2019/10/21/illustrated-guide-to-oauth-and-oidc) 流程案例: https://www.youtube.com/watch?v=9

    2024年02月05日
    浏览(28)
  • Spring Security对接OIDC(OAuth2)外部认证

    前后端分离项目对接OIDC(OAuth2)外部认证,认证服务器可以使用Keycloak。 后端已有用户管理和权限管理,需要外部认证服务器的用户名和业务系统的用户名一致才可以登录。 后台基于Spring Boot 2.7 + Spring Security 流程: 前台浏览器跳转到  后台地址 + /login/oauth2/authorization/my-oid

    2024年02月21日
    浏览(29)
  • Spring Boot中整合Keycloak OpenID Connect(OIDC)

    在Spring Boot中整合Keycloak OpenID Connect(OIDC)是一个常见的任务,用于实现身份验证和授权。Keycloak是一个开源的身份和访问管理解决方案,而OpenID Connect是构建在OAuth 2.0之上的认证和授权协议。下面是一个简单的步骤指南,用于在Spring Boot应用程序中整合Keycloak OIDC: 1. **创建

    2024年02月12日
    浏览(19)
  • 【Oauth2.0 单点登录 + 第三方授权认证】用户认证、授权模式

    本文主要对 SpringSecurity Oauth 2.0 用户认证,授权码授权模式、密码授权模式,以及授权流程进行讲解 开发中,有些功能只有管理员才有,普通用户是没有的。即需要对用户的身份进行认证,是管理员还是普通用户。认证方式有两种: 身份认证: 用户在访问相应资源时对用户

    2023年04月08日
    浏览(45)
  • 【分布式技术专题】「单点登录技术架构」一文带领你好好认识以下Saml协议的运作机制和流程模式

    传统上,企业应用程序在公司网络中部署和运行。为了获取有关用户的信息,如用户配置文件和组信息,这些应用程序中的许多都是为与公司目录(如Microsoft Active Directory)集成而构建的。更重要的是,通常使用目录存储和验证用户的凭据。例如,如果您使用在本地运行的Share

    2024年02月05日
    浏览(27)
  • oauth2.0第2季 分布式认证与授权实现单点登录

    1.使用jwttoken进行令牌传输,资源服务器在本地怎么验证token? 1.1.1 oauth是什么 1.1.2 oauth的角色 1.1.3 oauth的认证流程 1.1.4 oauth的4种模式 1.介绍单体架构  使用sesion保存会话信息的情况 2.前后端分离项目,调用方式 session架构不适合前后端分离项目 3.解决办法,引出oauth2.0 配置

    2024年02月11日
    浏览(32)
  • 微信公众平台测试号申请、使用HBuilder X与微信开发者工具实现授权登陆功能以及单点登录

    测试账号申请 测号响应流程:客户端发送请求,微信服务器收到请求后,转发到开发者服务器上,处理完后在发送给微信服务器,在返回给客户端 1、打开微信公众平台,点击测试帐号申请。地址:https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login, 通过微信扫一扫授权就能进

    2024年02月02日
    浏览(37)
  • .NET CORE开源 DDD微服务 支持 多租户 单点登录 多级缓存、自动任务、分布式、日志、授权和鉴权 、网关 、注册与发现 系统架构 docker部署

    源代码地址https://github.com/junkai-li/NetCoreKevin 基于NET6搭建跨平台DDD思想WebApi架构、IDS4单点登录、多缓存、自动任务、分布式、多租户、日志、授权和鉴权、CAP、SignalR、 docker部署  如需简约项目可直接去除项目引用 解耦设计都可以单独引用 架构默认全部引用并启动 项目启动时

    2023年04月24日
    浏览(33)
  • 【自学开发之旅】Flask-会话保持-API授权-注册登录

    http - 无状态-无法记录是否已经登陆过 #会话保持 – session cookie session – 保存一些在服务端 cookie – 保存一些数据在客户端 session在单独服务器D上保存,前面数个服务器A,B,C上去取就好了,业务解耦。—》》现在都是基于token的验证。 以上是基于BS架构 API授权 由服务端完全把

    2024年02月07日
    浏览(23)
  • 【Redis】基于Token单点登录

    流程图 业务实现 使用 Hutools工具类 生成随机验证码 将验证码保存到Redis 流程图 流程图 使用拦截器实现登录拦截和Token刷新 业务实现 拦截器配置类 Token刷新拦截器 拦截所有请求 用于刷新Token有效期,并将用户信息保存到ThreadLocal。之后使用ThreadLocal获取用户信息。 在请求头

    2024年01月19日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包