您现在的位置是:首页 > 恋爱课程恋爱课程

要认证单位的社交软件 记一个社交APP的开发过程——用户身份认证与在线标记

2021-06-04 16:05:52恋爱课程人已围观

简介要认证单位的社交软件 记一个社交APP的开发过程——用户身份认证与在线标记服务端怎么去把这个跟具体哪个用户对应起来?是一个集合,里面包含那些不需要就可以使用的功能,比如注册、登录,另外web.用户在线标记一下得到的用户id就是在线用户了。为了节约内存的使用,我这里没有使用的set,而是使用了的去做标记,每个bit代表一个用户,bit的索引是用户的id,bit值为0的时候说明用户不在线,bit值为1的时候说明用户在线。比如我要得到我的在线好友列表?

奕声情感

要认证单位的社交软件 记一个社交APP的开发过程——用户身份认证与在线标记

记住社交应用-用户身份验证和在线标记的开发过程

网站可以自动登录,通常是因为有一个值可以记录。然后验证在拦截 Web 应用程序中的请求的过滤器中读取的值。另外这个会有一个过期时间,一周或者一个月或者用户自己手动选择,但是现在越来越多的网站好像不再设置这个过期时间了,一直有效。从产品的角度来看,确实方便了用户,但是从安全的角度来看,也存在一定的隐患,大多在安全性提高的情况下,会失去一些产品的便利性,反之亦然。

对于移动应用程序,否。一般情况下,服务器在登录时会返回一个给客户端。对于后续的每次请求,客户端都必须将请求的URL作为参数传递给服务器。识别身份,例如 GET /api/v1/?=,对于移动应用要认证单位的社交软件,这通常不会过期,除非用户手动退出应用。

服务器如何将其与特定用户相关联?通常有两种方式。一种是通过可逆的加密算法和密钥对用户ID、创建时间等所有用户信息进行加密,并将加密后的字符串传递给客户端。当客户端发送字符串时,通过key来解锁活动相关的用户信息;第二种方法是根据用户的独特特征添加一些随机干扰生成不可逆的hash,然后服务器会保存用户ID到这个hash的映射关系,比如这样的表结构:

CREATE TABLE `user_token` (
  `token` varchar(32) NOT NULL,
  `user_id` int(11) NOT NULL,
  `created_on` datetime NOT NULL,
  PRIMARY KEY (`token`),
  UNIQUE (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

一是为了安全(全局key太危险),二是为了更好的控制发布。我这里选择了第二种实现方式,但是第二种方式最大的问题是每次验证用户身份都要读取库。所以在前面加一个,缓存过期时间为1天。先去图书馆看看。如果没有,那就去图书馆看看。这些逻辑都在一个web.py中进行,代码如下:

def checktoken(handler, *args):
    if web.ctx.path in _no_token_urls:
        return handler(*args)
    token = form(True, 'token')
    user_id = check_token(token) if token else None
    if user_id:
        mark_online(user_id)
        web.ctx.user_id, web.ctx.token = user_id, token
        return handler(*args)
    else:
        return output_json({"status":"ERROR",
                "error":{"code":"invalid token"}, "result":{}})

是一个集合,里面包含了注册、登录等不需要就可以使用的功能。另外,web.py 提供了一个非常强大的工具叫做 web.ctx,它是一个参数,它记录了请求线程的上下文。它们之间不会有任何干扰,获得的用户ID可以放在web.ctx中,供后续逻辑使用。

用户在线标记

对于基于Http的应用来说,标记哪些用户在线,哪些用户不在线可能根本不是问题,但是对于这个基于Http的无状态应用来说,标记是否在线需要一些波折。幸运的是, 和 有很多资源,我参考了一些文章。比如我没写多少代码就解决了这个问题。

总体思路是一样的。指定用户活动时间段,例如 5 分钟。如果用户在 5min 内没有任何活动(请求),那么即使他不在线,也将每分钟的活跃用户保存到一个集合中要认证单位的社交软件,例如 Set,在获取在线用户时,从该集合中获取的用户 id最后 5 分钟是在线用户。

为了节省内存的使用要认证单位的社交软件,我这里没有使用set,而是用它来做标记。每一位代表一个用户。该位的索引是用户的 id。当位值为0时,用户不在线。 ,当该位值为1时,表示用户在线。

def mark_online(user_id):
    now = int(time.time())
    expires = now + (_MAX_ACTIVE_TIME * 60) + 10
    user_online_key = rds.keys.user_online.key(now // 60)
    p = rds.default.pipeline()
    p.setbit(user_online_key, user_id, 1)
    p.expireat(user_online_key, expires)
    p.execute()

API 的操作非常友好。您可以使用该操作直接设置某个位的值,0或1,也就是我们指定的活动时间段,5min。每次调用web.py中也有这个函数。

那么如何获取数据呢?例如,我想获取我的在线好友列表?

def query_online(*user_id_list):
    current = int(time.time()) // 60
    minutes = xrange(_MAX_ACTIVE_TIME)
    keys = [rds.keys.user_online.key(current - x)
                         for x in minutes]
    online_data_lst = rds.default.mget(*keys)
    online_users = set()
    for online_data in online_data_lst:
        if not online_data:
            continue
        a = bitarray()
        a.frombytes(online_data)
        a_len = len(a)
        online_users.update({user_id
            for user_id in user_id_list if user_id < a_len and a[user_id]})
    return online_users

首先通过列表表达式生成最后5分钟的key列表,然后mget从中获取它们的值。这里要处理二进制位,需要将数据结构转换成数据结构,并且要达到同样的效率和紧凑,我找了一个很好的库调用,并转换为。剩下的就容易多了。只需取对应索引的值就可以知道最近5分钟有哪些用户活跃(在线)

Tags:要认证单位的社交软件

相关文章

站点信息

  • 文章统计12929篇文章
  • 浏览统计16816471次浏览
  • 评论统计0个评论
  • 标签管理标签云
  • 统计数据:统计代码
  • 微信:扫描二维码,关注我们