【问题标题】:Create Role Based Authorization in Auth0 and NextJS在 Auth0 和 NextJS 中创建基于角色的授权
【发布时间】:2021-11-01 02:14:21
【问题描述】:

我使用 Auth0 创建了一个 nextjs Web 应用程序。

用户可以登录和注销。我还可以获取用户信息。但我看不到用户角色。

我正在使用 Auth0 的 getSession 方法获取配置文件。

我想在 NextJS 中为 useradmin 角色创建 2 个不同的页面。

所以这将是我想要的基本 api 授权。如果用户是user 角色,则该用户只能访问用户页面。如果用户具有admin 角色,则该用户可以访问所有页面。

要实现这一点,我需要获取用户角色。getSession 方法不返回用户角色。

如何解决这个问题?

谢谢

【问题讨论】:

    标签: reactjs next.js auth0


    【解决方案1】:

    我相信你现在已经想通了,但我也有同样的问题。

    如果您希望将角色附加到用户对象,则必须将角色显式添加到您的令牌(Auth 和 id)中。

    您可以通过多种方式做到这一点,但我通过在 Auth0 中添加规则来做到这一点:

    function setRolesToUser(user, context, callback) {
      const namespace = 'http://my-website-name.com';
      const assignedRoles = (context.authorization || {}).roles;
    
      let idTokenClaims = context.idToken || {};
      let accessTokenClaims = context.accessToken || {};
    
      idTokenClaims[`${namespace}/roles`] = assignedRoles;
      accessTokenClaims[`${namespace}/roles`] = assignedRoles;
    
      context.idToken = idTokenClaims;
      context.accessToken = accessTokenClaims;
    
      callback(null, user, context);
    }
    

    现在,您的令牌将作为命名空间数组附加规则,并在所述数组中分配角色。

    现在您的令牌已附加角色,您可以使用它来控制 Nextjs 上的内容,如下所示:

    import { getSession } from '@auth0/nextjs-auth0';
    
    export async function getServerSideProps({ req, res }) {
     
      const session = getSession(req, res);
      if (!session?.user['http://my-website-name/roles'].includes('admin')) {
        return { props: { error: 'Forbidden' } };
      } else {
        return {
          props: {},
        };
      }
    }
    

    然后在你的组件中,你可以像这样提前返回:

    if (error) return <div>{error}</div>;
    

    这解释了服务器端,但您可以使用 useUser 做类似的客户端:

    import { useUser} from '@auth0/nextjs-auth0';
    

    【讨论】:

    • 嘿伙计!我正在尝试在注册时分配角色,但还不能这样做。我尝试为此创建一个规则,但我无法附加一个参数,我可以根据该参数决定当前用户是“管理员”还是“用户”。我也尝试过使用 Scopes,但它仍然失败。我需要知道如何在注册时附加一个可以作为决策因素的参数。你能帮帮我吗?谢谢
    • 请原谅我的第一个回复,我误读了您想要做的事情。不幸的是,我不需要以编程方式执行该功能。我们希望管理员能够手动控制其他管理员用户,以便 UI 在该场景中运行良好。否则,我没有研究过那个功能,也不太了解。
    • 别担心,伙计!感谢回复
    猜你喜欢
    • 2022-01-01
    • 2018-04-17
    • 2013-10-21
    • 1970-01-01
    • 1970-01-01
    • 2017-12-14
    • 2017-04-12
    • 2018-07-21
    相关资源
    最近更新 更多