一款Python认证和授权的利器

news2024/12/23 19:08:40

590e5e173087c7c4937d43aa1f49f834.png

迷途小书童

读完需要

7

分钟

速读仅需 3 分钟

1

   

简介

authlib 是一个开源的 Python 库,旨在提供简单而强大的认证和授权解决方案。它支持多种认证和授权协议,如 OAuth、OpenID Connect 和 JWT。authlib 具有灵活的架构和丰富的功能,使开发人员能够轻松地集成认证和授权功能到他们的应用程序中。authlib 最初由 Hsiaoming Yang 于 2018 年创建,并在 GitHub 上开源,它得到了广泛的社区支持和贡献,不断发展和改进,已经成为 Python 开发人员首选的认证和授权库之一。

2

   

实现原理

authlib 的底层实现原理涉及多个认证和授权协议的规范和流程。它使用了 Python 的加密和哈希算法库,如 cryptography 和 hashlib,以及 HTTP 请求库,如 requests。Authlib 还提供了易于使用的 API 和工具,大大简化了开发人员的工作。

3

   

安装步骤

要安装 authlib 库,可以使用 Python 的包管理工具 pip。在命令行中运行以下命令即可安装最新版本的 authlib

pip install authlib

4

   

使用方法

authlib 适用于各种应用场景,包括 Web 应用程序、移动应用程序和 API 服务。它可以用于用户认证、第三方登录、API 授权和安全访问控制等方面。authlib 提供了一套简单而强大的 API,用于处理认证和授权的相关操作,看下面这段代码示例

from flask import Flask, jsonify, url_for
from authlib.integrations.flask_client import OAuth


app = Flask(__name__)
oauth = OAuth(app)
github = oauth.register('github', {...})


@app.route('/login')
def login():
    redirect_uri = url_for('authorize', _external=True)
    return github.authorize_redirect(redirect_uri)


@app.route('/authorize')
def authorize():
    token = github.authorize_access_token()
    # you can save the token into database
    profile = github.get('/user', token=token)
    return jsonify(profile)

这段代码是一个使用 flask 框架和 authlib 库实现 GitHub 登录功能的示例。

首先,代码导入需要用到的模块,然后,创建了一个 flask 应用实例 app 和一个 OAuth 实例 oauth,并使用 oauth.register 方法注册了一个 GitHub 认证服务提供商。接下来,定义了两个路由函数 login 和 authorize。login 函数用于处理用户登录请求,它首先使用 url_for 函数生成授权回调的 URL,并将其作为参数传递给 github.authorize_redirect 方法,该方法将用户重定向到 GitHub 的授权页面。authorize 函数用于处理授权回调请求,它首先调用 github.authorize_access_token 方法获取访问令牌,然后使用该令牌调用 github.get 方法获取用户的 GitHub 个人资料信息。最后,使用 jsonify 函数将个人资料信息转换为 JSON 格式并返回给客户端。

下面再来看一个示例

from authlib.client import OAuth2Session


session = OAuth2Session(
    client_id='Your Client ID', client_secret='Your Client Secret',
    scope='user:email',
    redirect_uri='https://newexample.com/callback'
)


uri, state = session.create_authorization_url(
    'https://example.com/authorize'
)


authorization_response = 'https://newexample.com/callback?code=24..e2&state=s..w'


tokens = session.fetch_access_token(
    access_token_url='https://example.com/api/access_token',
    authorization_response=authorization_response
)


session = OAuth2Session(
    client_id='Your Client ID', client_secret='Your Client Secret',
    scope='user:email', state=state, redirect_uri='https://newexample.com/callback'
)
new_tokens = session.refresh_token(
    access_token_url, refresh_token=tokens['refresh_token']
)

这段代码使用了 authlib 库来实现 OAuth2 的授权流程。OAuth2 是一种用于授权和认证的开放标准,允许用户授权第三方应用访问其受保护的资源。

首先,代码创建了一个 OAuth2Session 对象,传入了必要的参数,如 client_id、client_secret、scope 和 redirect_uri。client_id 和 client_secret 是在注册第三方应用时获得的凭证,scope 表示授权的范围,redirect_uri 是用户授权后重定向的 URL。

接下来,代码调用 create_authorization_url 方法生成授权 URL,传入目标网址的授权入口 URL。生成的 URL 将包含授权请求的参数,如 client_id、redirect_uri 和 state。state 是一个随机生成的字符串,用于防止 CSRF 攻击。

然后,代码模拟用户在授权入口进行授权,并获取授权回调 URL。回调 URL 中包含了授权码 code 和之前生成的 state。

接着,代码调用 fetch_access_token 方法,传入目标网址的授权入口的 access_token_url 和授权回调 URL,该方法将使用授权码交换访问令牌,并返回令牌信息。

最后,代码使用刷新令牌 refresh_token 来刷新访问令牌,以保持长期访问。调用 refresh_token 方法,传入 access_token_url 和之前获取的刷新令牌,即可获取新的访问令牌。

请注意,上述代码中的一些参数和 URL 需要根据实际情况进行替换,如 client_id、client_secret、scope、redirect_uri、authorization_response、access_token_url 等。此外,还需要根据目标网址的授权入口的 API 文档,了解具体的授权流程和参数要求。

5

   

总结

authlib 是一个功能强大的Python库,专注于认证和授权的实现。它提供了简单而强大的API和工具,使开发人员能够轻松地集成认证和授权功能到他们的应用程序中,。希望这篇文章对您学习和使用authlib` 有所帮助!更多信息可以参考官方的文档和代码。

6

   

参考资料

  • https://github.com/lepture/authlib ( https://github.com/lepture/authlib )

  • https://docs.authlib.org/en/latest/ ( https://docs.authlib.org/en/latest/ )

7

   

免费社群

2cb3e1865629ec2fdb464eca66e625c5.jpeg

fe7f21ebb3f35427d7c15e77ce1db206.gif

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

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

相关文章

lS1028 + 六网口TSN 硬交换+QNX/Linux实时系统解决方案在轨道交通系统的应用

lS1028 六网口TSN 硬交换QNX/Linux实时系统解决方案在轨道交通系统的应用 以下是在轨道交通应用的实物: CPUNXP LS1028A架构双核Cortex-A72主频1.5GHzRAM2GB DDR4ROM8GB eMMCOSUbuntu20.04供电DC 12V工作温度-40℃~ 80℃ 功能数量参数Display Port≤1路支持DP1.3…

UniAccess Agent卸载

异常场景: UniAccess Agent导致系统中的好多设置打不开 例如:ipv4的协议,注册表,host等等 需要进行删除,亲测有效,及多家答案平凑的 借鉴了这位大神及他里面引用的大神的内容 https://blog.csdn.net/weixin_44476410/article/details/121605455 问题描述 这个进…

Android开发MVP架构记录

Android开发MVP架构记录 安卓的MVP(Model-View-Presenter)架构是一种常见的软件设计模式,用于帮助开发者组织和分离应用程序的不同组成部分。MVP架构的目标是将应用程序的业务逻辑(Presenter)、用户界面(V…

由于找不到msvcr110.dll的5种解决方法

在使用电脑的过程中,我们可能会遇到一些问题,比如打开软件时提示找不到 msvcr110.dll 文件丢失。这通常意味着该文件已被删除或损坏,导致程序无法正常运行。本文将介绍几种解决方案,帮助您解决这个问题。 首先,我们需…

Linxu下c语言实现socket+openssl数据传输加密

文章目录 1. Socket连接建立流程2、SocketSSL的初始化流程3、初始化SSL环境,证书和密钥4、SocketSSL 的c语言实现4.1 编写SSL连接函数4.2 编写加密服务端server.c4.3 编写加密客户端client.c 5、使用tcpdump检验源码获取 在进行网络编程的时候,我们通常使…

分布式算法相关,使用Redis落地解决1-2亿条数据缓存

面试题:1~2亿数据需要缓存,请问如何设计个存储案例 回答:单机单台100%不可能,肯定是分布式存储,用redis如何落地? 一般业界有三种解决方案: 哈希取余分区 2亿条记录就是2亿个k,v&…

Linux学习-HIS部署(3)

Jenkins插件资源下载 Jenkins部署 Jenkins部署 #Jenkins主机安装OpenJDK环境 [rootJenkins ~]# yum clean all; yum repolist -v ... Total packages: 8,265 [rootJenkins ~]# yum -y install java-11-openjdk-devel.x86_64 #安装OpenJDK11 [rootJenkins ~]# ln -s /usr/l…

Css 美化滚动条

/*设置滚动条宽度为 6px*/ ::-webkit-scrollbar {width: 6px; } /*设置背景颜色,并设置边框倒角,设置滚动动画,0.2 */ ::-webkit-scrollbar-thumb {background-color: #0003;border-radius: 10px;transition: all .2s ease-in-out; } /*设置滚…

探索创意的新辅助,AI与作家的完美合作

在现代社会,文学创作一直是人类精神活动中的重要一环。从古典文学到现代小说,从诗歌到戏剧,作家们以他们的独特视角和文学天赋为我们展示了丰富多彩的人生世界。而近年来,人工智能技术的快速发展已经渗透到各行各业,文…

Leetcode191. 位1的个数

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台 编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 1 的个数(也被称为汉明重量)。 思路&…

人工智能AI 全栈体系(六)

第一章 神经网络是如何实现的 这些年神经网络的发展越来越复杂,应用领域越来越广,性能也越来越好,但是训练方法还是依靠 BP 算法。也有一些对 BP 算法的改进算法,但是大体思路基本是一样的,只是对 BP 算法个别地方的一…

mapper文件添加@Mapper注解爆红

如图所示 报错原因&#xff1a;缺少相关的依赖 <dependency><groupId>org.mybatis.spring.boot</groupId><artifactId>mybatis-spring-boot-starter</artifactId><version>2.2.2</version> </dependency> 添加之后并刷新依赖…

C++: stack 与 queue

目录 1.stack与queue stack queue 2.priority_queue 2.1相关介绍 2.2模拟实现priority_queue --仿函数: --push --pop --top --size --empty --迭代器区间构造 2.3仿函数 3.容器适配器 stack模拟实现 queue模拟实现 学习目标: 1.stack和queue介绍与使用 2.pri…

Toaster - Android 吐司框架,专治 Toast 各种疑难杂症

官网 https://github.com/getActivity/Toaster 这可能是性能优、使用简单&#xff0c;支持自定义&#xff0c;不需要通知栏权限的吐司 想了解实现原理的可以点击此链接查看&#xff1a;Toaster 源码 集成步骤 如果你的项目 Gradle 配置是在 7.0 以下&#xff0c;需要在 bui…

如何使用Docker安装最新版本的Redis并设置远程访问(含免费可视化工具)

文章目录 安装Docker安装Redisredis.conf文件远程访问Redis免费可视化工具相关链接Docker是一种开源的应用容器引擎,使用Docker可以让我们快速部署应用环境,本文介绍如何使用Docker安装最新版本的Redis。 安装Docker 首先需要安装Docker,具体的安装方法可以参考Docker官方文…

用友U8 crm客户关系管理存在任意文件上传漏洞2 附POC

文章目录 用友U8 crm客户关系管理存在任意文件上传漏洞2 附POC1. 用友U8 crm客户关系管理简介2.漏洞描述3.影响版本4.fofa查询语句5.漏洞复现6.POC&EXP7.整改意见8.往期回顾 用友U8 crm客户关系管理存在任意文件上传漏洞2 附POC 免责声明&#xff1a;请勿利用文章内的相关…

知识图谱(5)知识表示

基于Node2Vec补全KG 知识图谱属于异质图&#xff0c;图谱包含三个元素&#xff1a;实体&#xff08;图中的节点&#xff09;&#xff0c;类型&#xff08;节点的标识&#xff09;&#xff0c;关系&#xff08;边的标识&#xff09;。KG就是把所有不同种类的信息连接在一起而得…

第1篇 目标检测概述 —(2)目标检测算法介绍

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。目标检测算法是一种计算机视觉算法&#xff0c;用于在图像或视频中识别和定位特定的目标物体。常见的目标检测算法包括传统的基于特征的方法&#xff08;如Haar特征和HOG特征&#xff09;以及基于深度学习的方法&#xff0…

C语言指针笔试题讲解

大家好&#xff0c;我们来学习一些C语言的指针笔试题。对于C语言指针的模块想必大家都非常的头疼吧&#xff0c;那么我们就来就来看看一些关于C语言指针的笔试题。 首先让我们看到我们今天的第一题。 int main() { int a[5] { 1, 2, 3, 4, 5 }; int *ptr (int *)(&a 1)…

AUTOSAR RTE介绍(更新版230925)

RTE是什么 AUTOSAR RTE(Run Time Environment)实现了AUTOSAR系统中的虚拟功能总线(VFB),提供了SWC(Software Component)之间的访问接口和SWC对于BSW资源的访问接口。RTE为SWC中的Runnable提供与其他SWC或者BSW模块通信的接口,RTE将Runnable映射到OS Task中,并且管理Runna…