大家好,我是木木。
今天给大家分享一个偏认证和授权方向的 Python 库,authlib。
它把 OAuth 1.0、OAuth 2.0、OpenID Connect、请求签名和一部分 JOSE 能力放进同一套工具里,适合做第三方登录、企业 SSO、服务账号接入,以及需要规范处理 access token 的 API 客户端。
项目地址:https://github.com/authlib/authlib官方文档:https://docs.authlib.org/
三大特点
协议覆盖面完整
Authlib 不是只做“某一个平台登录 SDK”,而是把 OAuth 1.0、OAuth 2.0、OpenID Connect 以及相关 RFC 的实现集中在一起。你接 GitHub、Google、企业内部 IdP,或者要自己做授权服务,都能在同一个体系里找到对应工具。
客户端和服务端都能落地
很多库只擅长“发起登录”,Authlib 既能做 requests/httpx 客户端,也能做 Flask、Django、Starlette、FastAPI 侧的 OAuth 客户端和 Provider。对团队来说,这意味着你不必每换一个框架就换一套鉴权思路。
细节能力足够工程化
真正让人省心的不是“能不能发请求”,而是 PKCE、Bearer Token、client authentication method、OAuth1 签名这些细节都已经被库收好。你可以把主要精力放在业务接入流程,而不是手搓协议字段。
最佳实践
安装方式:pip install authlib requests
功能一:生成带 PKCE 的 OAuth 2.0 授权地址
这段代码解决什么问题:当你要接入第三方登录,尤其是桌面端、移动端或前后端分离应用时,通常会用 Authorization Code + PKCE 流程。Authlib 可以把 code_challenge、state 和授权地址拼装好,避免你手动拼 query 参数。
fromauthlib.integrations.requests_clientimportOAuth2Sessionfromauthlib.oauth2.rfc7636importcreate_s256_code_challengecode_verifier='0123456789abcdef0123456789abcdef0123456789abcdef'code_challenge=create_s256_code_challenge(code_verifier)session=OAuth2Session('demo-client',redirect_uri='https://client.example.com/callback',scope='openid profile email',)authorize_url,state=session.create_authorization_url('https://server.example.com/oauth/authorize',state='demo-state-2026',code_challenge=code_challenge,code_challenge_method='S256',)print('state:',state)print('code_challenge:',code_challenge)print('authorize_url:',authorize_url)
这个例子里最实用的点有两个:第一,create_s256_code_challenge 帮你把 PKCE 的核心参数算好;第二,OAuth2Session.create_authorization_url 会把 redirect URI、scope、state 和 challenge 统一拼进授权地址。对接第三方登录时,这一步通常就是最先需要稳定下来的入口。
功能二:把拿到的 Bearer Token 直接附加到 requests 请求
这段代码解决什么问题:很多项目不是“从头实现 OAuth 流程”,而是已经拿到了 access token,接下来只想稳定地把它带到 API 请求里。Authlib 提供的 OAuth2Auth 能直接接到 requests 上,不需要你每次手写 Authorization 头。
importrequestsfromauthlib.integrations.requests_clientimportOAuth2Authrequest=requests.Request('GET','https://api.example.com/userinfo?lang=zh-CN')prepared=requests.Session().prepare_request(request)auth=OAuth2Auth({'token_type':'Bearer','access_token':'demo-access-token'})prepared=auth(prepared)print('method:',prepared.method)print('url:',prepared.url)print('authorization:',prepared.headers['Authorization'])
这类能力看起来简单,但在“多个 API 调用点都要带 token”的项目里很有价值。它能把 token 附加逻辑从业务代码里抽出来,后续如果要统一加刷新策略、封装 session 或切到别的 provider,也更容易维护。
功能三:给 OAuth 1.0 请求做签名
这段代码解决什么问题:有些老平台、企业内部系统或历史 API 仍然使用 OAuth 1.0。这个协议最麻烦的地方不是发 HTTP 请求,而是 nonce、timestamp、signature method 和 Authorization 头的签名细节。Authlib 能把这些部分封装掉。
importrequestsfromauthlib.integrations.requests_clientimportOAuth1Sessionsession=OAuth1Session('client-key','client-secret',token='user-token',token_secret='user-secret')request=requests.Request('POST','https://api.example.com/v1/status',data={'name':'mumu','scope':'write'})prepared=session.prepare_request(request)header=prepared.headers['Authorization']print('method:',prepared.method)print('url:',prepared.url)print('has consumer key:','oauth_consumer_key="client-key"'inheader)print('has user token:','oauth_token="user-token"'inheader)print('signature method:','HMAC-SHA1'if'oauth_signature_method="HMAC-SHA1"'inheaderelse'missing')print('body:',prepared.body)
如果你的项目里还有 Twitter 旧接口风格、历史合作方接口或自建 OAuth 1.0 服务,直接用这种封装会比自己拼签名稳定得多。尤其是排查线上签名失败时,统一交给库来处理会省掉很多低级错误。
环境与版本信息
高级功能
Authlib 不只是“客户端拿 token”这么简单。官方文档里还提供了 client_secret_jwt、private_key_jwt、Assertion Session、OpenID Connect、Flask/Django/FastAPI/Starlette 集成,以及 OAuth 授权服务器实现。对企业 SSO、服务账号、统一身份平台这类场景,它比普通登录 SDK 更接近一套协议工具箱。
还有一个需要注意的官方信号:README 明确写了 authlib.jose 后续会迁移到 joserfc。如果你的新项目重度依赖底层 JOSE 能力,可以提前关注官方迁移说明;如果你的重点是 OAuth/OIDC 客户端与服务端接入,Authlib 当前这套能力依然非常实用。
适用场景
- 需要接入第三方登录、企业 SSO、OpenID Connect 的 Python 服务
- 需要在 requests/httpx、Flask、Django、FastAPI、Starlette 中统一处理 OAuth 客户端逻辑
- 需要兼容 OAuth 1.0 历史接口和 OAuth 2.0 新接口的项目
- 想把 PKCE、Bearer Token、请求签名等协议细节交给成熟库处理的团队
不适用场景
- 只是请求一个完全不需要鉴权的普通 HTTP API
- 团队只需要某个单平台的极简登录 SDK,不想引入更完整的协议工具箱
- 项目主要关注前端 Web 登录流程,后端几乎不处理 token、session 或 provider 逻辑
- 对 JOSE 底层能力有大量新需求,但又不打算跟进官方的迁移方向
上线检查
- 明确区分你当前接的是 OAuth 1.0、OAuth 2.0 还是 OpenID Connect,不要把不同协议字段混在一起。
- 前后端分离或公有客户端场景优先启用 PKCE,并把
state、redirect_uri 校验收紧。 - 统一管理 access token、refresh token 和 client secret 的来源,不要散落在业务代码里。
- 如果使用
client_secret_jwt、private_key_jwt 或服务账号流程,提前确认 token endpoint 的鉴权方式和密钥轮换方案。
总结
Authlib 的价值在于它把“认证授权协议”从一堆零散技巧,收成了一套能在 Python 项目里稳定复用的工具。如果你的项目一边要接第三方登录,一边又要维护 API 客户端、旧接口兼容或企业身份接入,它会比单点型 SDK 更省心。