authlib是Python编写的OAuth库,支持众多OAuth相关的RFC。

根据authlibGithub页面,它支持OAuth 1.0,OAuth 2.0,JavaScript Object Signing and Ecryption,OpenID等待。社区版的authlib是BSD授权的,同时authlib也提供收费的商业授权

Python还有另一款OAuth库,叫做oauthlib。从Needs more maintainers #485看来,authlib应该是基于早期版本的oauthlib。在https://docs.authlib.org/en/latest/可以查看authlib的文档。

authlib / example-oauth2-server

authlib / example-oauth2-server是authlib在Flask上的应用示例。Flask则是基于Python WSGI的一个web服务框架,底层基于Werkzeug,默认使用Jinjia作为模板(在Github上尽然有5万颗星,真是厉害)。

安装authlib / example-oauth2-server的提示说明,只要将仓库克隆下来,然后执行pip install -r requirements.txt就行了。

在Windows上本地执行的话,可以写一个bat脚本来启动开发模式:

set FLASK_ENV=development
set AUTHLIB_INSECURE_TRANSPORT=1
flask run

http://127.0.0.1:5000/可以查看到登录页面。在这个页面上输入一个用户名,比如frog来登录。接下来需要为frog生成相关的OAuth验证信息,点击create client链接,按照authlib / example-oauth2-server相应的提示来输入信息。然后提交会生成相应的ClientId和ClientSecrete,将这两个保存下来,填写到下面的curl命令中${client_id}和${client_secret}:

curl -u ${client_id}:${client_secret} -XPOST http://127.0.0.1:5000/oauth/token -F grant_type=password -F username=${username} -F password=valid -F scope=profile

上面的${username} 应该替换成frog。执行这个curl命令之后,就可以看到服务器颁发的各种token。

curl的-u选项将${client_id}:${client_secret}包含在HTTP的头部字段发送,所以之前创建client的时候token_endpoint_auth_method 要指定成client_secret_basic。如果指定的是client_secret_post,那么就要将${client_id}:${client_secret}消息体中发送。

该例子中,所有的持久化信息都保存在sqlite:///db.sqlite中,可以用相关工具打开查看。

(本篇完)

2020-06-20更新

根据文档Refresh Token Grant¶,refresh token是作为一个Grant类型实现的。但是文档没有说的是,只有在client的grant类型中包含refresh_token的时候,才会在authorization code flow中颁发refresh token。

另外,authlib的代码功能主要是按照rfc来组织的。然后对各种不同类型的客户端,比如httpx, request;以及不同的服务端,比如flask,django提供支持。

(更新完)