Auth0 社交登录角色分配
Auth0 Social Login Role Assignment
在我当前的项目中,我们使用 Auth0 作为身份提供者。当前的架构只是一个由几个 API 支持的 ReactJS 应用程序。每个 API 都需要授权范围的不同组合,但基本上它们将需要客户角色、提供者角色或任何经过身份验证的用户。
到目前为止,我们一直在使用用户名-密码-身份验证,现在我们正在集成社交登录(例如 Facebook、Google 和 Apple)。
为了实现这一点,我们使用授权码流程,所以BE构造授权URL(包括回调URL,范围等),然后FE使用。在用户针对社交提供者进行身份验证后,调用回调 URL,我们将代码交换为最终返回给 FE 的 access_token。到目前为止一切顺利。
https://{domain}.auth0.com/authorize?
response_type=code&
client_id={clientId}&
audience={audience}&
connection=facebook&
state={ramdom_value}&
redirect_uri={callbackUrl}&
scope=offline_access openid scope:customer
这里出现了一些问题。
首先,将Authentication Code换成access_token后,token不包含其中的作用域,所以用户无法访问API。我必须创建一个自定义规则来添加客户角色,如下所示:
function (user, context, callback) {
var count = context.stats && context.stats.loginsCount ? context.stats.loginsCount : 0;
if (count > 1 || (context.connection !== 'facebook' && context.connection !== 'google-oauth2' && context.connection !== 'apple')) {
return callback(null, user, context);
}
var ManagementClient = require('auth0@2.17.0').ManagementClient;
var management = new ManagementClient({
token: auth0.accessToken,
domain: auth0.domain
});
management.assignRolestoUser(
{ id : user.user_id},
{ "roles" :["rol_Msm9ykmstuK09r9s"]},
function (err) {
if (err) {
callback(err);
} else {
callback(null, user, context);
}
}
);
}
我真的不明白为什么我需要创建规则才能获得有效 access_token。
其次,用户有两种可能的角色,客户和提供商。目前,我们只允许客户使用社交登录,但最终我们还需要支持提供商。我们无法检测在该规则内实际登录的用户类型。
所以我的问题是如何解决它。
我的最终目标是允许用户(客户和提供商)使用社交连接登录,并让他们每个人都拥有他们真正需要的角色。当然,我需要获得一个有效的 access_token 以便用户可以与我们的 API 进行交互。
有什么想法或意见吗?我错过了什么?
我终于想出了一个优雅的解决方案。
我采用的方法是:
创建分配两个角色(客户和提供商)的自定义规则 仅当:
1.1。这是该用户的首次登录
1.2。连接类型是 facebook
或 google-oauth2
或 apple
在为登录创建 URL 时,根据所需的用户角色仅包括所需的范围。此外,回调 url 将在其中包含用户角色,例如https://server/{platform}/callback/{role}
在回调端点中,使用 Auth0 管理删除不需要的角色 API /api/v2/users/{id}/roles
这个解决方案有点棘手,但只需要相对较少的编码和工作量。
在我当前的项目中,我们使用 Auth0 作为身份提供者。当前的架构只是一个由几个 API 支持的 ReactJS 应用程序。每个 API 都需要授权范围的不同组合,但基本上它们将需要客户角色、提供者角色或任何经过身份验证的用户。 到目前为止,我们一直在使用用户名-密码-身份验证,现在我们正在集成社交登录(例如 Facebook、Google 和 Apple)。
为了实现这一点,我们使用授权码流程,所以BE构造授权URL(包括回调URL,范围等),然后FE使用。在用户针对社交提供者进行身份验证后,调用回调 URL,我们将代码交换为最终返回给 FE 的 access_token。到目前为止一切顺利。
https://{domain}.auth0.com/authorize?
response_type=code&
client_id={clientId}&
audience={audience}&
connection=facebook&
state={ramdom_value}&
redirect_uri={callbackUrl}&
scope=offline_access openid scope:customer
这里出现了一些问题。
首先,将Authentication Code换成access_token后,token不包含其中的作用域,所以用户无法访问API。我必须创建一个自定义规则来添加客户角色,如下所示:
function (user, context, callback) {
var count = context.stats && context.stats.loginsCount ? context.stats.loginsCount : 0;
if (count > 1 || (context.connection !== 'facebook' && context.connection !== 'google-oauth2' && context.connection !== 'apple')) {
return callback(null, user, context);
}
var ManagementClient = require('auth0@2.17.0').ManagementClient;
var management = new ManagementClient({
token: auth0.accessToken,
domain: auth0.domain
});
management.assignRolestoUser(
{ id : user.user_id},
{ "roles" :["rol_Msm9ykmstuK09r9s"]},
function (err) {
if (err) {
callback(err);
} else {
callback(null, user, context);
}
}
);
}
我真的不明白为什么我需要创建规则才能获得有效 access_token。
其次,用户有两种可能的角色,客户和提供商。目前,我们只允许客户使用社交登录,但最终我们还需要支持提供商。我们无法检测在该规则内实际登录的用户类型。 所以我的问题是如何解决它。
我的最终目标是允许用户(客户和提供商)使用社交连接登录,并让他们每个人都拥有他们真正需要的角色。当然,我需要获得一个有效的 access_token 以便用户可以与我们的 API 进行交互。
有什么想法或意见吗?我错过了什么?
我终于想出了一个优雅的解决方案。
我采用的方法是:
创建分配两个角色(客户和提供商)的自定义规则 仅当:
1.1。这是该用户的首次登录
1.2。连接类型是
facebook
或google-oauth2
或apple
在为登录创建 URL 时,根据所需的用户角色仅包括所需的范围。此外,回调 url 将在其中包含用户角色,例如
https://server/{platform}/callback/{role}
在回调端点中,使用 Auth0 管理删除不需要的角色 API
/api/v2/users/{id}/roles
这个解决方案有点棘手,但只需要相对较少的编码和工作量。