如何进行接口鉴权
使用说明
AstroZero提供了“客户端模式”和“授权码模式”两种授权模式,进行OAuth鉴权。
- 每个OAuth都有特定的用途,建议为不同的第三方系统单独新建一个OAuth。
- 关于“客户端模式”和“授权码模式”的更多介绍,请参见配置OAuth管理。本章节主要介绍自定义OAuth2授权码模式接入鉴权。
客户端模式接入认证
- 参考登录管理中心中操作,登录AstroZero管理中心。
- 创建机机用户账号。
机机用户只能通过OAuth客户端模式鉴权,登录AstroZero。
- 在左侧导航栏中,选择“用户管理 > 用户”,单击“新建”。
- “用户类型”选择为“机机用户”,设置其他用户信息,单击“保存”。
图1 新建机机用户
- 在左侧导航栏中,选择“系统管理 > OAuth”,单击“新建”。
- 授权类型选择“客户端模式”,参照表1设置其他参数后,单击“保存”。
- 每个OAuth都有特定的用途,建议为不同的第三方系统单独新建一个OAuth。
- OAuth关联的用户需要具有访问相关API的权限,否则会因为权限问题导致回调失败。
表1 新建客户端模式参数说明 参数
参数说明
名称
新建接入认证的名称,用于标识待接入的第三方系统名称。
授权类型
对第三方系统进行OAuth 2.0接入认证的授权类型,选择“客户端模式”。
用户
选择2中创建的机机用户,当第三方鉴权成功后,将获取和此用户相同的权限。
登录IP范围
是否指定登录IP范围,勾选后,表示只有在指定范围内的IP地址才可以接入AstroZero。
起始地址
起始IP地址,必须为合法的IPv4地址,且必须小于等于结束地址。
勾选“登录IP范围”后,才会显示该参数。
结束地址
结束IP地址,必须为合法的IPv4地址,且必须大于等于起始地址。
勾选“登录IP范围”后,才会显示该参数。
描述
接入认证的描述信息。
- 在OAuth管理列表中,单击该鉴权所在行的,下载密钥文件到本地,从中获取鉴权的客户端ID和鉴权密钥取值。
下载到本地的密钥文件名为“认证名称.csv”,文件中包含如下参数:
- username:4中选择的用户。
- client_id:鉴权的客户端ID。
- client_secret:鉴权的密钥。
- 根据鉴权ID和鉴权密钥调用接口“/baas/auth/v1.0/oauth2/token”,获取access_token。
表2 接口基本信息 接口名称
接口路径
接口协议
接口方法
token
/baas/auth/v1.0/oauth2/token
HTTPS
POST
表3 请求参数说明 参数名称
类型
必选(M)/可选(O)
参数位置
参数含义
值
grant_type
String
M
Body
授权模式,对应OAuth2.0中的grant_type字段的值。
配置为client_credentials,即客户端模式。
client_id
String
M
Body
鉴权的客户端ID。
配置为5中获取的值。
client_secret
String
M
Body
鉴权密钥。
配置为5中获取的值。
redirect_url
String
O
Body
重定向URL。
根据实际需求配置
locale
String
O
Body
语言。
en_US
样例:
通过Curl请求模拟接口调用:curl -i -X POST -H "Content-Type: application/x-www-form-urlencoded" -d 'grant_type=client_credentials&client_id=鉴权ID值&client_secret=鉴权密钥值' https://域名/baas/auth/v1.0/oauth2/token
响应如下:
{ "access_token": "ACCESS_TOKEN", "expires_in": 7200, "token_type": "Bearer" }
请记录获取的access_token,后续第三方需要通过该access_token访问业务接口。
- 第三方调用的业务接口。
例如,某用户在AstroZero中安装了电梯设备管理应用,此处以调用自定义接口“queryEquipments”(电梯设备查询接口)为例进行说明。
- 通过下面的REST接口调用“queryEquipments”。
https://域名/service/syw__Elevator/1.0.1/queryEquipments
其中“域名”替换为对外提供的开发态域名“appcube.cn-north-4.huaweicloud.com”,“service/syw__Elevator/1.0.1/queryEquipments”为自定义接口URL。
- (可选,调用公共接口时,当需要做CSRF校验时,请执行该步骤),调用接口“https://AstroZero域名/u-route/baas/sys/v1.0/csrf/get”获取“csrf-token”值,返回的result取值即为“csrf-token”值。
调用该接口时,需要在请求消息头上设置“access-token”,即6中获取的值。
- 在请求消息头Request Header中增加“access-token”:“ACCESS_TOKEN”、“Content-Type”:“application/json”、“csrf-token”:“上一步result取值”。
- 在请求消息体中,写入该接口的输入参数。
{ "equipmentSn": "001" }
- 调用成功,返回输出结果。
{ "interviewId": "002N000000MJ77KcFGwC", "outputs": { "Equipments": [ { "命名空间__equipmentBrand__CST": null, "命名空间__equipmentModel__CST": null, "命名空间__equipmentSN__CST": "9996660001", "命名空间__fullAddress__CST": "", "命名空间__installationDetailAddress__CST": null, "命名空间__installationSiteArea__CST": "", "命名空间__installationSiteCity__CST": "", "命名空间__installationSiteProvince__CST": "", "命名空间__latitude__CST": "", "命名空间__longitude__CST": "", "createdBy": "10gd000000MEGPaz7P16", "createdBy.__objectType": "User", "createdBy.name": "test", "createdDate": "2018-12-19 06:39:29", "currencyIsoCode": "", "custom": true, "equipmentSn__CST": "9996660001", "fullAddress__CST": "", "id": "c000000000MFhgYMQtmq", "installedPackage": null, "isLocked": false, "lastModifiedBy": "10gd000000MEGPaz7P16", "lastModifiedBy.__objectType": "User", "lastModifiedBy.name": "test", "lastModifiedDate": "2018-12-19 06:39:29", "latitude__CST": "", "longitude__CST": "", "name": "荔枝苑10栋1单元1号", "owner": "10gd000000MEGPaz7P16", "owner.__objectType": "User", "owner.name": "test" }, { "命名空间__equipmentBrand__CST": "", "命名空间__equipmentModel__CST": null, "命名空间__equipmentSN__CST": "3217890001", "命名空间__fullAddress__CST": "ssss", "命名空间__installationDetailAddress__CST": null, "命名空间__installationSiteArea__CST": null, "命名空间__installationSiteCity__CST": null, "命名空间__installationSiteProvince__CST": null, "命名空间__latitude__CST": null, "命名空间__longitude__CST": null, "createdBy": "10gd000000MEGPaz7P16", "createdBy.__objectType": "User", "createdBy.name": "test", "createdDate": "2018-12-18 12:49:46", "currencyIsoCode": "", "custom": true, "equipmentSN__CST": "3217890001", "fullAddress__CST": "ssss", "id": "c000000000METF70NiZk", "installedPackage": null, "isLocked": false, "lastModifiedBy": "10gd000000MEGPaz7P16", "lastModifiedBy.__objectType": "User", "lastModifiedBy.name": "test", "lastModifiedDate": "2018-12-21 07:34:06", "latitude__CST": "", "longitude__CST": "", "name": "A栋1单元1号", "owner": "10gd000000MEGPaz7P16", "owner.__objectType": "User", "owner.name": "test" } ], "total": "2" } }
- 通过下面的REST接口调用“queryEquipments”。
授权码模式接入认证
- 参考登录管理中心中操作,登录AstroZero管理中心。
- 在左侧导航栏中,选择“系统管理 > OAuth”,单击“新建”。
- 授权类型选择“授权码模式”,参照表4设置其他参数后,单击“保存”。
每个OAuth都有特定的用途,因此建议为不同的第三方系统单独新建一个OAuth。
- 在OAuth管理列表中,单击该鉴权所在行的,下载密钥文件到本地,从中获取客户端鉴权ID和鉴权密钥取值。
密钥只需创建一次,不需要重复新建。密钥文件中包含如下参数:
- redirect_uri:为3中设置的重定向地址。
- client_id:鉴权的客户端ID。
- client_secret:鉴权密钥。
- 获取授权码code。
第三方系统访问获取授权码code的接口为“https://域名/baas/auth/v1.0/oauth2/authorize?response_type=code&client_id=鉴权ID值&redirect_uri=重定向地址”。如果第三方系统选择同意接受授权,认证服务器将浏览器重定向到之前第三方系统注册时指定的重定向地址,同时附带上授权码,即重定向地址/?code=授权码。
若引导第三方系统打开页面时,提示“该链接无法访问”,请检查如下参数是否填写错误:
- 获取access_token。
客户端收到授权码code,根据鉴权ID、鉴权密钥和授权码code在后端调用接口“ https://域名/baas/auth/v1.0/oauth2/token”获取access_token。后续第三方需要通过access_token获取授权用户信息。
表5 接口基本信息 接口名称
接口路径
接口协议
接口方法
token
https://域名/baas/auth/v1.0/oauth2/token
HTTPS
POST
样例:
通过Curl请求模拟接口调用:curl -i -X POST -H "Content-Type: application/x-www-form-urlencoded" -d 'grant_type=authorization_code&client_id=鉴权ID值&client_secret=鉴权密钥值&redirect_uri=重定向地址&code=授权码' https://域名/baas/auth/v1.0/oauth2/token
响应如下:
{ "access_token": "ACCESS_TOKEN", "expires_in": 7200, "refresh_token":"REFRESH_TOKEN", "token_type": "Bearer" }
- (可选)刷新access_token。
access_token的有效期较短,例如6中获取的access_token,有效期是7200秒(即2小时),当access_token超时后,可使用refresh_token进行刷新。refresh_token有效期为30天,当refresh_token失效之后,需要用户重新授权。
获取6中的refresh_token后,可使用如下链接获取access_token:
https://域名/baas/auth/v1.0/oauth2/token?grant_type=refresh_token&client_id=鉴权ID值&client_secret=客户端鉴权密钥&refresh_token=REFRESH_TOKEN
- 获取授权用户信息。
使用GET请求方法,调用“https://域名/u-route/baas/oauth/v1.0/userinfo”请求,获取授权用户信息。
{ "resCode": "0", "resMsg": "成功", "result": { "usrname": "test", "alias": "", "email": "test@example.com", "aboutme": "", "company_name": "name01", "photo": "", "address": "", "phone": "188XXXX8888", "country": "", "post_code": "", "province": "", "city": "" } }
自定义OAuth2授权码模式接入鉴权
配置OAuth管理中介绍了第三方系统访问AstroZero时,如何配置接入鉴权,通过鉴权认证的第三方系统才可访问AstroZero。在AstroZero中开发的应用也可以通过自定义OAuth2授权码模式接入鉴权,当应用配置鉴权后,只有通过鉴权的第三方系统才可访问应用。
- 参考配置OAuth管理中操作,获取鉴权ID“client_id”和鉴权密钥“client_secret”。
- 在经典版应用设计器的服务中,开发者通过自定义接口,给第三方接入调用,用于第三方系统获取授权码code。
- 应用调用脚本API,判断第三方客户端的鉴权ID“client_id”和重定向地址“redirect_url”是否和注册接入鉴权时匹配。
如果匹配,则由平台应用自定义接口,实现登录跳转和授权跳转。在授权完成后,再调用脚本API获取授权码code,并将需要展示给第三方的授权用户信息,通过该API传给AstroZero,AstroZero会返回一个code,然后应用重定向到“redirect_url”,并携带code。
- 判断第三方客户端的鉴权ID“client_id”和重定向地址“redirect_url”是否和注册接入鉴权时,匹配的API样例如下:
// Here's your code. import * as oauth from 'oauth' let handle = oauth.getAuthorizeHandle() let clientDatas: oauth.clientDataFromApp = { redirect_uri: "http://10.26.30.68:14000/appauth/code", client_id: "bff4398905ee4a918722debec98b594c", } let pass = handle.checkURL(clientDatas) console.log(pass) //true if (pass){ //判断是否登录,做登录跳转 //判断是否授权,做授权跳转 }
- 获取授权码code的脚本API样例如下:
// Here's your code. import * as oauth from 'oauth' let handle = oauth.getAuthorizeHandle() //前面步骤已经走完 let clientDatas: oauth.clientDataFromApp = { redirect_uri: "http://10.26.30.68:14000/appauth/code", client_id: "bff4398905ee4a918722debec98b594c", } let userInfo = { "name": "jack", "phone": "1256287222", "email": "example.com" } let code = handle.getAuthCode(clientDatas, userInfo) console.log(code) //WEUcqXbeQDKUHxcn8til3Q
- 判断第三方客户端的鉴权ID“client_id”和重定向地址“redirect_url”是否和注册接入鉴权时,匹配的API样例如下:
- 第三方系统接收到该请求,并解析出code后,在自己的后端访问AstroZero接口获取access_token,其步骤和配置OAuth管理中一致。
- 第三方系统在获取到access_token后,使用该凭证访问平台“https://AstroZero域名/u-route/baas/oauth/v1.0/third/userinfo”接口,来获取授权用户的信息。
响应示例如下:
{ "resCode": "0", "resMsg": "成功", "result": { "email": "example.com", "name": "jack", "phone": "1256287222" } }