React
对应的官方页面地址
如何
首先,按照此处所述创建 React 应用程序。
生成 React 应用程序后,我们要安装我们的客户端库:
npm install @passwordlessdev/passwordless-client我们的登录页面可能包含类似以下内容:
import {useContext, useRef, useState} from "react";
import authContext from "../context/AuthProvider";
import * as Passwordless from "@passwordlessdev/passwordless-client";
import YourBackendClient from "../services/YourBackendClient";
import {PASSWORDLESS_API_KEY, PASSWORDLESS_API_URL} from "../configuration/PasswordlessOptions";
export default function LoginPage() {
const errRef = useRef();
const [errMsg, setErrMsg] = useState("");
const [success, setSuccess] = useState(false);
const { setAuth } = useContext(authContext);
const handleSubmit = async (e) => {
e.preventDefault();
// 如果是自托管,PASSWORDLESS_API_URL 将与 https://v4.passwordless.dev 不同
const passwordless = new Passwordless.Client({
apiUrl: PASSWORDLESS_API_URL,
apiKey: PASSWORDLESS_API_KEY
});
const yourBackendClient = new YourBackendClient()
// 首先我们获取我们的令牌
const token = await passwordless.signinWithDiscoverable();
if (!token) {
return;
}
// 然后您在后端验证令牌的有效性。
const verifiedToken = await yourBackendClient.signIn(token.token);
// 例如,如果您的令牌被视为有效,您的后端可能会返回 JWT 令牌。
localStorage.setItem('jwt', verifiedToken.jwt);
// 我们很高兴能继续。
setAuth({ verifiedToken });
setSuccess(true);
}
return (
<>
{success ? (
<section>
<h1>You are logged in!</h1>
<br />
<p>{/* <a href="#">Go to Home</a> */}</p>
</section>
) : (
<section>
<p
ref={errRef}
className={errMsg ? "errmsg" : "offscreen"}
aria-live="assertive"
>
{errMsg}
</p>
<h1>Sign In</h1>
<button onClick={handleSubmit}>Sign In</button>
<p>
Need an Account?
<br />
<span className="line">
<a href="#">Sign Up</a>
</span>
</p>
</section>
)}
</>
);
}我们的注册页面可能看起来像这样:
假设您有多个组件需要访问与身份验证相关的数据,例如用户是否已登录。您可以使用此 AuthContext 向任何需要它的组件提供身份验证状态和更新功能,而不是通过组件层次结构以道具的形式传递这些数据。这减少了对道具钻探的需要,并使代码更清晰、更易于维护。
例如,您可以在子组件中使用 useContext 钩子来访问 AuthContext.Provider 提供的 auth 状态和 setAuth 函数。
我们的 index.jsx: AuthProvider 将封装您的整个应用程序,使所有使用它的组件都能获得身份验证状态。
我们需要能够解码 JWT 令牌,并读取用户分配的角色。
在我们的 app.jsx 中或无论您路由到哪里,您都可以按如下方式定义您的路由,无论您是否需要特定角色来访问某个路由。
参考
最后更新于