Auth0社交登录角色分配

问题描述 投票:0回答:1

在我当前的项目中,我们使用Auth0作为身份提供者。当前的架构只是一个受几个API支持的ReactJS应用程序。每个API都需要不同的授权范围组合,但是基本上它们将需要客户角色,提供者角色或任何经过身份验证的用户。到目前为止,我们一直在使用Username-Password-Authentication,现在我们正在集成社交登录名(例如Facebook,Google和Apple)。

为了实现此目的,我们使用授权码流程,因此BE构造了FE随后使用的Authorize URL(包括Callback URL,范围等)。在用户通过社交服务提供商进行身份验证之后,将调用回调URL,然后我们将代码交换为access_token,最终将其返回给FE。到目前为止一切顺利。

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

这是出现一些问题的地方。

[首先,在将身份验证代码交换为access_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('[email protected]').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进行交互。

有任何想法或意见吗?我想念什么?

oauth-2.0 authorization access-token auth0
1个回答
0
投票

我毕竟想出了一个优雅的解决方案。

我采用的方法是:

  1. 创建分配两个角色(客户和提供者)的自定义规则仅且仅当

    1.1。这是该用户的首次登录]

    1.2。连接类型为facebookgoogle-oauth2apple

  2. 创建用于登录的URL时,仅根据所需的用户角色包括所需的范围。另外,回调网址将在其中包含用户角色,例如https://server/{platform}/callback/{role}

  3. 在回调终结点中,使用Auth0管理API /api/v2/users/{id}/roles]删除不需要的角色>

    此解决方案有点棘手,但只需相对较少的编码和工作即可。

© www.soinside.com 2019 - 2024. All rights reserved.