欢迎访问宙启技术站
智能推送

使用Python编写的基于Token的单点登录(SSO)系统

发布时间:2024-01-02 16:26:19

单点登录(SSO)系统是一种允许用户使用一组登录凭据访问多个相关应用程序的身份验证机制。在SSO系统中,用户只需要登录一次,系统就会为其生成一个 的令牌(Token),该令牌可以用于访问其他应用程序而无需再次输入用户名和密码。

下面是一个使用Python编写的基于Token的SSO系统的示例代码:

import uuid
import time

# 用户信息字典,用于模拟数据库中的用户数据
user_db = {
    "user1": {"password": "pwd1", "token": ""},
    "user2": {"password": "pwd2", "token": ""}
}

# 用于存储用户令牌的字典,实际场景中可以将令牌存储在缓存或数据库中
token_db = {}

# 生成随机的令牌
def generate_token():
    return str(uuid.uuid4())

# 用户登录函数
def login(username, password):
    if username in user_db and user_db[username]["password"] == password:
        token = generate_token()
        user_db[username]["token"] = token
        token_db[token] = username
        return token
    else:
        return None

# 检查用户是否已登录的装饰器
def require_login(func):
    def wrapper(*args, **kwargs):
        if "token" in kwargs:
            token = kwargs["token"]
            if token in token_db:
                username = token_db[token]
                return func(*args, **kwargs, username=username)
        return "Not logged in"
    return wrapper

# 示例应用程序
class MyApp:
    @require_login
    def get_user_profile(self, username):
        return f"Profile for user {username}"

    @require_login
    def get_user_data(self, username):
        return f"Data for user {username}"

# 使用示例
if __name__ == "__main__":
    app = MyApp()

    # 用户登录并获取令牌
    token = login("user1", "pwd1")
    print(f"User1 token: {token}")

    # 用户使用令牌访问应用程序
    profile = app.get_user_profile(token=token)
    data = app.get_user_data(token=token)
    print(profile)
    print(data)

    # 用户注销
    user_db["user1"]["token"] = ""
    del token_db[token]

    # 用户再次尝试访问应用程序
    profile = app.get_user_profile(token=token)
    print(profile)

在上述示例代码中,我们首先定义了一个存储用户信息的字典user_db,该字典模拟了数据库中的用户数据。然后,我们定义了一个用于生成随机令牌的函数generate_token,以及一个用于用户登录的函数login

接下来,我们定义了一个装饰器require_login,该装饰器用于检查用户是否已登录。在示例应用程序MyApp中,我们使用了该装饰器来保护需要登录才能访问的函数。

在示例中,我们首先调用login函数登录用户,并获取到用户的令牌。然后,在应用程序中调用需要登录才能访问的函数时,我们将令牌作为关键字参数传递,并使用require_login装饰器来检查用户是否已登录。

最后,我们可以看到,在用户注销后再次访问应用程序时,用户将无法访问受保护的函数,因为他们的令牌已被移除。

这只是一个简单的示例,实际的SSO系统可能涉及更多的安全性措施,例如加密令牌、Token的过期时间等。此示例提供了一个基本框架,可以根据实际需求进行扩展和定制。