操作场景
该任务指导您在 API 网关控制台上为 API 配置 OAuth 2.0 授权访问,满足个性化安全设置的需求。
OAuth 2.0 说明
OAuth 2.0 是一个开放授权标准,它允许用户让第三方应用访问该用户在某服务的特定私有资源但是不提供账号密码信息给第三方应用。OAuth2.0 是一个授权协议,不是认证协议。
OAuth 2.0 角色
OAuth2.0 有以下四个角色:
角色 | 说明 |
腾讯云 API 网关 | 提供授权服务的中间方。 |
自定义业务 API | 访问请求的最终服务后端,用于实际处理业务,由用户自定义。 |
客户端 | 用户自定义的客户端,或者第三方应用客户端,指任何可以消费的应用。 |
自定义授权 API | 用于授权的服务 API,由用户自定义。 |
OAuth 2.0 授权流程
提前准备
1.客户端的访问者,请求获得授权。
2.提供服务的自定义业务 API 资源的所有者,同意授权。
系统访问时的时序流程
1.客户端申请认证请求,到达腾讯云 API 网关。
2.申请认证请求,从腾讯云 API 网关到达用户自定义授权服务的 API,在授权服务中验证请求并生成私钥加密后的 token。
3.认证成功,自定义授权服务响应 token 给腾讯云 API 网关。
4.腾讯云 API 网关响应 token 给客户端。
5.客户端携带 token 继续请求业务 API。
6.腾讯云 API 网关使用公钥验证 token。验证成功则将业务请求到用户自定义的业务 API。
7.用户自定义业务 API 响应业务结果,返回到腾讯云 API 网关。
8.腾讯云 API 网关将业务结果响应到客户端。
前提条件
准备分发 token 的授权服务器(您需要自建授权服务器,API 网关提供了 Python3 Demo 和 Golang Demo 供您参考)。
已经创建一个 API 网关服务(参见 创建服务)。
操作步骤
步骤1:授权服务器的搭建(以 Python3 Demo 为例)
1. 在 API 网关官方仓库中下载 Python3 Demo。
2. 生成 RSA 公钥和私钥。使用 Python3 运行 produce_key.py,生成三个文件:
public_pem :pem 格式的公钥。
priv_pem :pem 格式的私钥。
public :json 格式的公钥,该文件的内容用于配置 API 网关的授权 API。具体格式如下:
{"e":"AQAB","kty":"RSA","n":"43nSuC6lmGLogEPgFVwaaxAmPDzmZcocRB4Jed_dHc-sV7rcAcNB0iHyuGfNkfOAE2uhHVjdXuO6DBYGz4pnTwRZ5_wFrW0DlrlJQAXSvg6B2N1uda_aqySNw3rrvdh38rVG7HxFmyPbLXcpJtyfkiRNyZ1WhSpH0NciIRrFbW2mKRtOZsBGfBgmNqPGcGrMA71cuqNAQ9RMKmAF37iGXkx0tWMBQ_PL2aviHhtsiPbT3zIO7qUG3cleBHnS61kid3K8F38z9-5Hj-1zdTIP8iS4rAt4FmhvKvtOocRPYGq0W_dLLxmi4DYgIV2GJE93WyZ1EUvgRGhpcHvyT65z4w"}
3. 启动服务。安装 bottle 库、pip3 install bottle 后,使用 Python3 运行 server.py。server.py 用于提供 token,执行后可以简单验证生成 token是否成功。
curl localhost:8080/tokeneyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1OTIyNzgwODksImZvbyI6ImJhciIsImlhdCI6MTU5MjI3Nzc4OSwianRpIjoibFY1TS10S2oxMEdtV0pJcHotM01GUSIsIm5iZiI6MTU5MjI3Nzc4OSwid3VwIjo5MH0.aHyZo2jgkNxVRDMtEiRBU4-n0pMfa0gocu92KQBe-nmbFoeI_5EWTJ8XFNnSIuoCAIFvrd9MSUX2DNVTg0woXukjoKOTjZSx4txknaXs1aApdvW74FVddCrMtdLrKh_VlwPOrEaOGesmtfcR3RN8xWnj1oedPW-HKPEqVpIAIIWO8ilCBFF-5yffcnFGIbfYO0t7OeBBviCQnQjWAmQHnteOZm0CBeG22k7rlnjH96qE_kyq7DHQqGmURjlpGxoXRC6E-AiV-3mYrCGnsAosEltuIUtq8VIbTZabSobFDE92C8us4GFtIVJQB2NWgeB3Hxgpz3Dlb4NCCcCkZbryEQ
步骤2:新建 API 作为授权 API
1. 在已创建的服务中,新建 API(参见 创建通用 API),前端配置时,鉴权类型选择
OAuth2.0
,OAuth 模式选择授权API
。
2. 后端配置时,后端域名选择自己的个人服务器地址,token携带位置选择
Header
,公钥输入执行文件 produce_key.py 生成的 public 文件中的内容,创建完成后单击完成。步骤3:新建API作为业务 API
1. 在授权 API 的同一个服务中,新建 API(参见 创建通用 API)作为业务 API,前端配置时,鉴权类型选择
OAuth2.0
,OAuth 模式选择业务API
,关联授权 API 下拉选择刚刚创建的授权 API。
2. 后端配置时,后端类型选择 Mock 类型,在 body 中输入
hello world
。步骤4:验证
1. 请求授权 API,获取 token。
curl http://service-cmrrdq86-1251890925.gz.apigw.tencentcs.com:80/token
返回结果:
eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1OTIyNzk3MTAsImZvbyI6ImJhciIsImlhdCI6MTU5MjI3OTQxMCwianRpIjoiZlBGYlFZRkR4REx3d0lXTFl0aHBBQSIsIm5iZiI6MTU5MjI3OTQxMCwid3VwIjo5MH0.0JQquNRVCQ8n9hPV-mJi6Mku_7G3T1jFp68Sk2AYBijpzzBMQ1KOcREyo9G6QOpvdctynGOAPkL3cwqeTzkFhWgGj633pu_MdLjlectEBMGyVQIv6pL8OBMCHMQzTUTpHWJ_NoUkLpRLKGqZFFcXW8q7v4KeCbf8xHUa9OCH5VF2JxYOnFWDVgucSqao06r0Jaq64LDwKIhLw77ujheKpcBjRrf1kqoIpqk2qhb8CzxM36g_DawMadzKmX49dT-k7auNnI2xUtu5CZdXZ3lSmLeicXfGjc66rrH_acqUqipZRKeeQ5F3Ma467jPQaTeOKiCMHwS2_yp-sXNU2GzxOA
说明
您可通过两种方式获取token:为保护授权服务器本身,本文采用了请求 API 网关的授权 API 地址来获取 token;您也可以直接从授权服务器快速获取 token。
2. 使用已获取的 token 请求业务 API,可以看到, 能够成功请求。
curl http://service-cmrrdq86-1251890925.gz.apigw.tencentcs.com:80/work -H'Authorization:Bearer id_token="eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1OTIyNzk3MTAsImZvbyI6ImJhciIsImlhdCI6MTU5MjI3OTQxMCwianRpIjoiZlBGYlFZRkR4REx3d0lXTFl0aHBBQSIsIm5iZiI6MTU5MjI3OTQxMCwid3VwIjo5MH0.0JQquNRVCQ8n9hPV-mJi6Mku_7G3T1jFp68Sk2AYBijpzzBMQ1KOcREyo9G6QOpvdctynGOAPkL3cwqeTzkFhWgGj633pu_MdLjlectEBMGyVQIv6pL8OBMCHMQzTUTpHWJ_NoUkLpRLKGqZFFcXW8q7v4KeCbf8xHUa9OCH5VF2JxYOnFWDVgucSqao06r0Jaq64LDwKIhLw77ujheKpcBjRrf1kqoIpqk2qhb8CzxM36g_DawMadzKmX49dT-k7auNnI2xUtu5CZdXZ3lSmLeicXfGjc66rrH_acqUqipZRKeeQ5F3Ma467jPQaTeOKiCMHwS2_yp-sXNU2GzxOA"'
返回结果:
hello world
使用授权码的方式获取 token
以上示例中可以看到,获取 token 时并没有使用授权码进行获取,为了确保指定的用户才能获取到 token,根据授权流程,需要有一个步骤需去资源拥有者那里获取授权码,从 server.py 文件中可以看到,可以第一步请求 code 路径获取授权码,而同时获取 token 的时候,需要对发放的 code 进行登记,判断是否合法。