网站同步登录(通常称为单点登录,SSO, Single Sign-On)的实现可以非常复杂,因为它涉及到多个系统、安全性和身份验证协议。但是,我可以给你一个简化的概念性示例,说明如何在两个或多个网站之间实现单点登录。
1. 使用JWT(JSON Web Tokens)或OAuth等协议
JWT 和 OAuth 是两种常用的身份验证和授权协议,它们可以帮助你实现单点登录。
JWT 示例
- 用户登录:用户在主站点(如
auth.example.com)上登录。 - 生成JWT:服务器验证用户凭据并生成一个JWT。这个JWT包含了用户的身份信息和一些其他数据(如过期时间)。
- 返回JWT:服务器将JWT返回给客户端(通常通过HTTP响应头)。
- 客户端存储JWT:客户端将JWT存储在本地(如localStorage、Cookies等)。
- 后续请求:当客户端访问其他站点(如
app1.example.com 或 app2.example.com)时,它会将JWT包含在请求头中。 - 验证JWT:这些站点会验证JWT的有效性(如签名、过期时间等),并确定用户的身份。
OAuth 示例
OAuth 更复杂,但它允许第三方应用程序以安全的方式访问用户的资源(如邮箱、文件等)。OAuth 通常涉及一个授权服务器、资源服务器和客户端。
2. 代码示例(简化版)
这里是一个简化的JWT示例,只涉及用户登录和JWT生成/验证。
服务器端(Node.js + Express + jsonwebtoken)
| constexpress =require('express'); |
|
| constjwt =require('jsonwebtoken'); |
|
| app.post('/login',(req, res) =>{ |
|
| constuser = {id:1,username:'john_doe'}; |
|
| consttoken = jwt.sign(user,'your_secret_key', {expiresIn:'1h'}); |
|
| app.get('/protected',(req, res) =>{ |
|
| consttoken = req.headers['authorization']?.split(' ')[1]; |
|
| if(!token)returnres.status(401).send('No token provided.'); |
|
| constdecoded = jwt.verify(token,'your_secret_key'); |
|
| res.json({message:'Protected resource',user: decoded }); |
|
| res.status(403).send('Failed to authenticate token.'); |
|
| app.listen(3000,() =>console.log('Server started on port 3000')); |
客户端(JavaScript + Fetch API)
| fetch('http://localhost:3000/login', { |
|
| 'Content-Type':'application/json' |
|
| .then(response=>response.json()) |
|
| fetch('http://localhost:3000/protected', { |
|
| 'Authorization':`Bearer${data.token}` |
|
| .then(response=>response.json()) |
|
| .then(data=>console.log(data)); |
|
请注意,这只是一个非常简化的示例,用于说明基本概念。在实际应用中,你需要考虑更多的安全性、错误处理和其他方面。