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注册并返回您的站点时,您可以将身份管理平台返回的基本详细信息存储在strapi
的OAuthUsers
集合下。
现在,关于如何存储用户偏好的问题,您可以做的是创建另一个名为 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 来覆盖 find
、update
和 delete
方法以不执行任何操作。 async create (ctx) return false;
。因此,唯一暴露的方法是 create
方法,当他新注册时,可以调用该方法为经过身份验证的用户创建新的 0AuthUser
条目,仅此而已。因此,您在安全方面都得到了保障。以上是关于Strapi,使用 Auth0 访问 Strapi 中的用户数据的主要内容,如果未能解决你的问题,请参考以下文章