Strapi,使用 Auth0 访问 Strapi 中的用户数据

Posted

技术标签:

【中文标题】Strapi,使用 Auth0 访问 Strapi 中的用户数据【英文标题】:Strapi, use Auth0 to access user data in Strapi 【发布时间】:2021-10-21 00:16:47 【问题描述】:

我有一个使用 Strapi 作为其主要 API 的 React Native 应用程序。

一些 API 端点需要身份验证,所以我使用了 Auth0 提供程序,一切正常。

用户现在可以登录,我正在安全地存储他们的 access_tokens。

到目前为止,Auth0 只给了我一个 access_token、一个 refresh_token、一个 id_token(jwt 包含姓名和电子邮件等)和令牌的到期时间。

但我想知道是否可以存储用户偏好,例如他们喜欢深色还是浅色主题等,以及 Strapi 中的 user_id 等额外信息,并让他们在使用 Auth0 登录后对其进行更新。

要注意的是,只有该用户才能对自己的数据进行读/写访问。

我看不到有关此类事情的任何文档或指导。有没有其他人设法实现这种东西,如果是这样,一个粗略的方法会很棒!

谢谢!

【问题讨论】:

【参考方案1】:

嗯,这样做的一种方法是在strapi中创建一个OAuthUsers集合,它将保存用户的基本详细信息,例如:

    first_name last_name email

当用户在Auth0注册并返回您的站点时,您可以将身份管理平台返回的基本详细信息存储在strapiOAuthUsers集合下。

现在,关于如何存储用户偏好的问题,您可以做的是创建另一个名为 preferences 的集合,具有以下属性:

    is_dark_theme OAuthUser (与OAuthUsers 集合建立one-to-one 关系)

每次登录用户更新他的首选项时,它都会首先出现并在此集合中创建一个条目(如果尚不存在)。如何检查用户是否存在条目是使用来自JWT 令牌本身的电子邮件,您将其作为bearer 令牌附加到API 调用上。我假设,您已经知道如何解码 JWT 令牌。

所以一个基本的设计应该是这样的:

const is_dark_theme = request.body.is_dark_theme; // 1 or 0 for light theme
const user = await strapi.services.OAuthUsers.find( email: '[email from JWT]');
const preference = await strapi.services.preferences.find( OAuthUser: user.id );

if(preference)
await strapi.services.preferences.update(is_dark_theme, id: preference.id);
else
await strapi.services.preferences.create(is_dark_theme, user: user.id);

因此,用户将只能更新自己的详细信息,而无法触及其他用户的偏好,因为用户只能从前端传递 is_dark_theme 参数其余信息将从JWT 令牌中获取。

【讨论】:

有趣!这听起来不错。但在安全方面,任何人都可以只 cURL 请求 0AuthUsers 集合并从那里读/写,对吗? 不,先生。您可以为 public 用户角色禁用 Strapi 中对 OAuthUser 的读写 API。因此,只有经过身份验证的用户才能请求数据。此外,您还可以覆盖控制器中的find 方法,以仅返回该特定用户的数据,而不是所有用户的数据。我假设您已经熟悉strapi 中的角色管理和权限管理。因此,经过身份验证的用户只能请求和更新自己的数据,而不能更新其他人的数据。 因此,我们的想法是阻止公共用户访问0AuthUsers collections api 本身。对于经过身份验证的用户,您可以通过仅返回 false 来覆盖 findupdatedelete 方法以不执行任何操作。 async create (ctx) return false; 。因此,唯一暴露的方法是 create 方法,当他新注册时,可以调用该方法为经过身份验证的用户创建新的 0AuthUser 条目,仅此而已。因此,您在安全方面都得到了保障。

以上是关于Strapi,使用 Auth0 访问 Strapi 中的用户数据的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Strapi 中配置角色层次结构(权限继承)?

使用 11ty 循环来自 strapi 的图像

如何使用 Cloudinary 和 Strapi 延迟加载图像?

Strapi安装过程中依赖安装报错

使用 React 前端托管 Strapi 的地方

Strapi 自定义路由重定向到公共目录