产品定价 立即试用
PE MQTT Broker
文档 > 安全 > OAuth 2.0
入门
安装 架构 API 常见问题
目录

OAuth 2.0

概述

TBMQ专业版支持基于OAuth 2.0协议的外部用户管理平台,为用户提供单点登录(SSO),并自动创建管理员或只读用户。 支持OAuth 2.0的平台示例:GoogleAuth0KeycloakOktaAzure等。

OAuth 2.0认证流程

TBMQ支持授权码(Authorization Code)许可类型,用授权码换取访问令牌。 用户被重定向回TBMQ客户端后,平台从URL获取授权码,并向外部用户管理平台请求访问令牌。 通过基础映射器自定义映射器,将外部平台的用户信息转换为TBMQ内部OAuth 2.0用户。 随后执行常规TBMQ授权流程。

通过外部提供商配置认证

OAuth 2.0客户端与域名分开配置,可复用已配置客户端并简化设置。 要通过外部提供商认证,需先配置带必要凭据的OAuth 2.0客户端。 然后添加新域名或使用已有域名,并将新客户端加入该域名的OAuth 2.0客户端列表。

域名操作

添加域名

添加新域名按以下步骤:

  • 在“OAuth 2.0”页的“域名”标签中,点击“加号”图标添加新域名;
  • 填写域名及OAuth 2.0客户端;
  • 点击“添加”完成。

编辑域名

更新已有域名设置,按以下步骤:

  • 点击域名查看详情;
  • 点击大橙色按钮进入编辑模式;
  • 进行所需修改;
  • 点击“应用更改”保存。

删除域名

删除域名,按以下步骤:

  • 点击要删除域名行的“垃圾桶”图标;
  • 在确认对话框中点击“是”。

OAuth2.0客户端操作

添加OAuth 2.0客户端

在TBMQ中添加新OAuth 2.0客户端,按以下步骤:

  • 进入“OAuth 2.0”页的“OAuth 2.0客户端”标签,点击“加号”图标;
  • 输入客户端描述性标题;
  • 从下拉菜单选择认证提供商;
  • 填写从认证提供商获取的Client ID和Client Secret;
  • 按需配置高级设置;
  • 点击“添加”完成。

编辑OAuth 2.0客户端

更新已有OAuth 2.0客户端:

  • 点击客户端查看详情;
  • 点击大橙色按钮进入编辑模式;
  • 进行所需修改;
  • 点击“应用更改”保存。

删除OAuth 2.0客户端

删除不再使用的客户端:

  • 点击要删除客户端行的“垃圾桶”图标;
  • 在确认对话框中点击“是”。

使用Google登录

本示例使用 Google 进行认证。

将Google外部用户信息映射到OAuth平台时,可使用内置基础映射器。 若基础映射器不满足业务需求,可配置自定义映射器以获得更多灵活性。

准备工作

使用Google OAuth 2.0认证前,需在 Google API Console 中创建项目以获取OAuth 2.0凭据。

参考 OpenID Connect 页面说明或下方步骤配置OAuth 2.0客户端。 配置完成后将获得Client ID和Client Secret。

  • 在左侧菜单进入“凭据”页,在“创建凭据”下拉中选择“OAuth客户端ID”;
  • 输入OAuth客户端名称,并在“已授权的重定向URI”中加入TBMQ重定向URI,格式如下:
1
http(s)://domain:port/login/oauth2/code/
  • domain 替换为您的TBMQ域名,并指定HTTP访问端口。 若域名为 my.tbmq.org,示例:
1
https://my.tbmq.org/login/oauth2/code/
  • 点击“创建”。

OAuth客户端已创建,您将获得 Client IDClient Secret

在TBMQ中将Google配置为OAuth 2.0认证提供商

在TBMQ中通过Google配置OAuth 2.0认证,按以下步骤:

  • 登录TBMQ实例;
  • 进入“安全”下的“OAuth 2.0”页面;
  • 在“域名”标签中点击“加号”图标;
  • 输入TBMQ实例的域名或IP地址;
  • 在“OAuth 2.0客户端”中点击“创建新”添加客户端。

添加新OAuth 2.0客户端:

  • 标题输入“Google”;
  • 提供商选择“Google”;
  • 填入 Google API Console 中的Client ID和Client Secret。

展开“高级设置”并配置“通用”区块:

  • 使用此链接查看最新 URL(如“Access Token URI”“Authorization URI”);
  • 客户端认证方法选择“POST”;
  • 启用“允许创建用户”;
  • 在scope字段添加:emailopenidprofile

在“映射器”区块:

  • 映射器类型保持“BASIC”;
  • 指定要分配的角色;
  • 点击“添加”。
  • OAuth客户端已成功添加。再次点击“添加”确认域名添加。

新域名已添加完成。

登录

进入TBMQ登录页后,将出现“使用Google登录”选项。 选择您的Google账户,即可使用该邮箱登录TBMQ。

在“用户”页面可查看新创建的用户。

使用Auth0登录

本示例通过外部提供商 Auth0 配置 OAuth 认证。

将Auth0外部用户信息映射到OAuth平台时,使用内置基础映射器

基础映射器不满足需求,可配置自定义映射器以实现所需映射。

准备工作

现在向列表中添加另一个提供商——Auth0

要正确应用配置,首先需要获取OAuth 2.0凭证:

  • 进入Auth0管理控制台。打开”Applications”页面,点击”+ Create Application”按钮;
  • 将应用程序命名为”TBMQ”,选择应用程序类型为Regular Web Applications
  • 接下来选择所使用的技术。请选择Java Spring Boot
  • 创建应用程序后,您将被重定向到应用程序详情页面。导航到Settings选项卡以查找Client IDClient Secret
  • Allowed Callback URLs字段中,使用以下格式更新重定向URI:
1
http(s)://domain:port/login/oauth2/code/
  • domain替换为您的TBMQ域名,并指定HTTP访问使用的端口。 例如,如果您的域名是my.tbmq.org
1
https://my.tbmq.org/login/oauth2/code/
文档信息图标

请注意,不需要更新Application Login URI。

  • Advanced Settings部分中,您将找到配置OAuth 2.0所需的所有URL(端点);
  • 点击Save Changes按钮。

在TBMQ中将Auth0配置为OAuth 2.0认证提供商

要通过Auth0在TBMQ中配置OAuth 2.0认证,请按照以下步骤操作:

  • 登录您的TBMQ实例;
  • 进入”Security”部分中的”OAuth 2.0”页面;
  • 在”Domains”选项卡中,点击”+”图标;
  • 输入您的TBMQ实例的域名或IP地址;
  • 在”OAuth 2.0 clients”部分中点击”Create new”以添加新的客户端。

添加新的OAuth 2.0客户端:

  • 在打开的窗口中,输入Auth0作为客户端的标题;
  • 从下拉菜单中选择Custom作为提供商;
  • 输入从Auth0管理控制台获取的Client IDClient Secret

在”Advanced settings”部分的General块中:

  • 使用从Auth0管理控制台获取的值填写所有必需的URL;
  • 选择POST作为客户端身份验证方法;
  • 输入Auth0作为提供商标签;
  • 在范围字段中添加以下范围:openidemailprofile


前往”Mapper”块:

  • 将映射器类型保留为BASIC
  • 指定要使用的角色;
  • 点击Add以完成新OAuth 2.0客户端的添加。
  • Auth0客户端已成功添加。再次点击Add确认域名的添加。

登录

导航到登录屏幕。您现在将找到Auth0登录方法。 点击”Login with Auth0”按钮。

进入”Users”页面。您将看到已创建新用户。

使用Keycloak登录

本示例使用 Keycloak 进行认证。

将Keycloak外部用户信息映射到OAuth平台时,使用内置基础映射器

基础映射器不满足需求,可配置自定义映射器以实现所需映射。

准备工作

要使用Keycloak进行身份验证,您需要在Keycloak中设置一个项目来获取OAuth 2.0凭证。 遵循官方说明或以下步骤。 最后,您应该拥有一个新的Keycloak客户端,其凭证包括Client ID和Client Secret。

启动Keycloak

使用您的首选方法开始使用Keycloak。 在此示例中,我们将在Docker上运行测试Keycloak服务器。

  • 确保您已安装Docker
  • 运行以下命令在本地端口8081上启动Keycloak,并创建初始管理员用户,用户名为admin,密码为admin
1
docker run -p 8081:8080 -e KC_BOOTSTRAP_ADMIN_USERNAME=admin -e KC_BOOTSTRAP_ADMIN_PASSWORD=admin quay.io/keycloak/keycloak:26.0.5 start-dev

登录到管理控制台

创建领域

  • 点击master领域旁的”Keycloak”,然后点击”Create realm”按钮;
  • 在领域名称字段中输入ThingsBoard,然后点击”Create”。

新领域已创建。

创建新客户端

客户端代表请求用户身份验证的应用程序或服务。

  • 在左侧菜单中进入”Clients”页面,点击”Create client”按钮;
  • 输入thingsboard作为客户端ID。将客户端类型保留为OpenID Connect。点击”Next”;
  • 启用Client authentication选项。确认已启用Standard flow。点击”Next”;
  • 在”Login settings”部分中,使用以下格式在Authorized Redirect URIs部分添加TBMQ重定向URI:
1
http(s)://domain:port/login/oauth2/code/
  • domain替换为您的TBMQ域名,并指定HTTP访问使用的端口。 例如,如果您的域名是my.thingsboard.instance
1
https://my.thingsboard.instance/login/oauth2/code/
  • 点击”Save”。

客户端创建成功。


现在您拥有包括Client ID和Client Secret的凭证。 Client ID在”Settings”选项卡上可用。Client Secret位于”Credentials”选项卡上。

端点

作为完全兼容的OpenID Connect提供商,Keycloak公开了一组端点,应用程序和服务可以使用这些端点进行身份验证和授权。

  • 进入”Realm settings”页面;
  • 向下滚动并找到”OpenID Endpoint Configuration”链接,然后点击它;
  • 将打开一个新窗口显示配置。选中”Pretty-print”选项以便于阅读。

在这里您可以找到Access Token URIAuthorization URIJSON Web Key URIUser Info URI等值,这些是在TBMQ中配置OAuth 2.0客户端所需的。 可用端点的描述在这里提供。

创建用户

现在添加一个用户。只有添加的用户才能通过Keycloak进行身份验证。

  • 在左侧菜单中进入”Users”页面;
  • 点击”Create new user”;
  • 输入用户名和电子邮件地址。名字和姓氏是可选的;
  • 点击”Create”。

用户已创建。

为此用户设置密码:

  • 导航到”Credentials”选项卡并点击Set password
  • 填写密码表单。将Temporary切换为Off,以便用户在首次登录时不被强制更改密码;
  • 点击Save password

密码已成功设置。

在TBMQ中将Keycloak配置为OAuth 2.0认证提供商

要通过Keycloak在TBMQ中配置OAuth 2.0认证,请按照以下步骤操作:

  • 登录您的TBMQ实例;
  • 进入”Security”部分中的”OAuth 2.0”页面;
  • 导航到”OAuth 2.0 clients”选项卡,点击”+”图标;
  • 输入Keycloak作为标题;
  • 从下拉菜单中选择Custom作为提供商;
  • 输入从Keycloak控制台检索的Client IDClient Secret

然后展开”Advanced settings”菜单并配置”General”块:

  • 使用端点配置文件查找Access Token URIAuthorization URIJSON Web Key URIUser Info URI的当前值。填入相应的字段;
  • 将客户端身份验证方法设置为POST
  • 输入Keycloak作为提供商标签;
  • 添加以下范围:emailopenidprofile

进入”Mapper”块:

  • 将映射器类型保留为BASIC
  • 指定要使用的角色;
  • 点击Add确认。

新的OAuth 2.0客户端已添加。


现在添加一个新域名:

  • 进入”OAuth 2.0”页的”Domains”选项卡,点击”+”图标;
  • 输入您的TBMQ实例的域名或IP地址;
  • 指定Keycloak作为OAuth 2.0客户端;
  • 再次点击Add确认。

新域名已添加。

登录

进入TBMQ登录屏幕。您现在将看到Login with Keycloak选项。 点击此按钮。将打开一个窗口提示您登录到Keycloak账户。 输入您的Keycloak凭证并点击Sign In。您现在已使用Keycloak登录TBMQ。

进入”Users”页面。您将发现已创建新用户。

将外部用户映射到TBMQ内部用户结构

将外部用户信息对象映射为TBMQ用户时,可使用 BasicCustom、GitHub和Apple映射器。

基础映射器

基础映射器按预定义规则将外部OAuth 2.0用户信息对象合并为TBMQ OAuth 2.0用户。

使用基础映射器时,将映射器类型设为Basic

可用属性说明:

  • 允许创建用户:启用后,若TBMQ中尚不存在该用户账户,将自动创建。 禁用时,若没有对应的TBMQ用户,使用外部OAuth 2.0提供商登录将返回 access denied 错误。

  • 邮箱属性键:外部OAuth 2.0用户信息中用于TBMQ用户邮箱的属性键。

  • 名属性键:外部OAuth 2.0用户信息中用于TBMQ用户名的属性键。

  • 姓属性键:外部OAuth 2.0用户信息中用于TBMQ用户姓的属性键。

  • 角色:从预定义角色中选择分配给用户的角色。

若用户通过 OAuth 2.0 登录且启用了 Allow user creation 选项,系统会自动创建用户账号。 这些用户创建时未设置密码,可继续使用 Single Sign-On (SSO) 登录。 若用户希望通过常规 username/password 登录,需进入 Account → Security设置新密码。 修改密码时,Current password 字段留空即可。

自定义映射器

若基础映射器不满足业务需求,可配置自定义映射器以实现所需逻辑。

自定义映射器为与TBMQ微服务并列运行的独立微服务。TBMQ将所有映射请求转发至该微服务,并期望返回TBMQ OAuth 2.0用户对象。

可参考此基础实现作为自定义映射器起点。

使用自定义映射器时,将映射器类型设为Custom

可用属性说明:

  • URL:自定义映射器端点的URL;
  • username:若自定义映射器端点启用了基本认证,在此填写 username
  • password:若自定义映射器端点启用了基本认证,在此填写 password

HAProxy配置

若TBMQ运行在HAProxy等负载均衡器之后,需正确配置均衡算法以确保会话落在同一TBMQ实例:

1
2
3
4
backend tbmq-api-backend
  ...
  balance source # balance 必须设为 'source'
  ...

同时为HTTP和HTTPS请求配置ACL映射:

1
2
3
4
frontend http-in
  ...
  acl tbmq_api_acl path_beg /api/ /swagger /webjars /v2/ /oauth2/ /login/oauth2/ # '/oauth2/ /login/oauth2/' added
  ...
1
2
3
4
frontend https_in
  ...
  acl tbmq_api_acl path_beg /api/ /swagger /webjars /v2/ /oauth2/ /login/oauth2/ # '/oauth2/ /login/oauth2/' added
  ...