Authentication ID令牌或访问令牌是否应用于授权SPA功能? 上下文

Authentication ID令牌或访问令牌是否应用于授权SPA功能? 上下文,authentication,oauth-2.0,authorization,openid-connect,okta,Authentication,Oauth 2.0,Authorization,Openid Connect,Okta,我有一个与后端RESTAPI通信的单页应用程序。此REST API专门为SPA服务。为了在主页之外导航或使用SPA的任何功能,用户必须首先登录。我正在使用OIDC和Okta对用户进行身份验证。用户可以具有管理员角色,也可以具有用户角色。它们的角色将用于授权允许它们导航到哪些SPA页面,以及允许它们进行哪些REST API调用 问题 用户登录后,我的应用程序从Okta接收ID令牌和访问令牌。我可以选择将用户角色作为自定义声明包含在ID令牌或访问令牌中。哪个令牌应包含此信息?两者都有 UI需要根据

我有一个与后端RESTAPI通信的单页应用程序。此REST API专门为SPA服务。为了在主页之外导航或使用SPA的任何功能,用户必须首先登录。我正在使用OIDC和Okta对用户进行身份验证。用户可以具有管理员角色,也可以具有用户角色。它们的角色将用于授权允许它们导航到哪些SPA页面,以及允许它们进行哪些REST API调用

问题
  • 用户登录后,我的应用程序从Okta接收ID令牌和访问令牌。我可以选择将用户角色作为自定义声明包含在ID令牌或访问令牌中。哪个令牌应包含此信息?两者都有

  • UI需要根据用户角色做出一些授权决策。 例如,要显示或隐藏哪些HTML元素,以及哪些SPA路线是可导航的。这些决定应该通过检查ID令牌还是访问令牌来做出?其他的

  • 通过SPA调用后端API时,我是否应转发SPA收到的ID令牌和访问令牌?只是访问令牌?或者我应该为我的后端RESTAPI设置一个不同的授权服务器,并让我的SPA接触另一个访问令牌

  • 一些答案:

  • id令牌只是SPA的一个断言,表明用户已通过身份验证。如果要将角色放入令牌中,请使用访问令牌,其目的是授权

  • API应该控制授权。您的SPA应该询问您的API关于授权区域的信息,API可以根据访问令牌内容进行回答。您的SPA不应直接读取访问令牌

  • 仅向API发送访问令牌,这是标准的推荐行为

  • 责任

    一般来说:

    • UI可以决定显示哪些元素
    • 当然,他们使用的数据需要来自可靠的来源
    • UI可以从id标记中读取角色,并使用它来控制要显示的内容
    • 但是API还需要角色信息来授权请求
    如果希望在UI和API中同时使用角色信息,则默认选项是将角色添加到id令牌和访问令牌中

    然而,这并不能很好地扩展,因为在一个真正的商业应用程序中,随着时间的推移,您可能会添加多个类似的规则,并且需要不断地向令牌添加声明

    可扩展性

    随着时间的推移,一个更容易管理的更好的选择是UI向其API请求角色+其他数据,因为API无论如何都需要相同的角色信息

    此外,令牌不必是UI和API做出授权决策的唯一数据源。My描述了一种模式,您可以使用该模式管理来自多个数据源的长期索赔。

    一些答案:

  • id令牌只是SPA的一个断言,表明用户已通过身份验证。如果要将角色放入令牌中,请使用访问令牌,其目的是授权

  • API应该控制授权。您的SPA应该询问您的API关于授权区域的信息,API可以根据访问令牌内容进行回答。您的SPA不应直接读取访问令牌

  • 仅向API发送访问令牌,这是标准的推荐行为

  • 责任

    一般来说:

    • UI可以决定显示哪些元素
    • 当然,他们使用的数据需要来自可靠的来源
    • UI可以从id标记中读取角色,并使用它来控制要显示的内容
    • 但是API还需要角色信息来授权请求
    如果希望在UI和API中同时使用角色信息,则默认选项是将角色添加到id令牌和访问令牌中

    然而,这并不能很好地扩展,因为在一个真正的商业应用程序中,随着时间的推移,您可能会添加多个类似的规则,并且需要不断地向令牌添加声明

    可扩展性

    随着时间的推移,一个更容易管理的更好的选择是UI向其API请求角色+其他数据,因为API无论如何都需要相同的角色信息


    此外,令牌不必是UI和API做出授权决策的唯一数据源。My描述了一种模式,您可以使用它来管理来自多个数据源的索赔。

    关于答案2。您是否建议UI不根据令牌的内容做出UI决策(例如,显示或隐藏什么),而是调用API以找出访问令牌中的角色?我更新了原始答案。如果希望UI从令牌中读取角色,则应将其添加到id令牌中。但是,API也需要该角色,在这种情况下,您可能还需要将其添加到访问令牌中。谢谢Gary。你的答案很清楚,谢谢你暗示了一个我从未想过的选择。我现在正在浏览你们的博客,内容非常丰富。关于答案#2。您是否建议UI不根据令牌的内容做出UI决策(例如,显示或隐藏什么),而是调用API以找出访问令牌中的角色?我更新了原始答案。如果希望UI从令牌中读取角色,则应将其添加到id令牌中。但是,API也需要该角色,在这种情况下,您可能还需要将其添加到访问令牌中。谢谢Gary。你的答案很清楚,谢谢你暗示了一个我从未想过的选择。我现在正在读你的博客,内容非常丰富。