关于一个门户下多个直播栏目分别鉴权的思考

最近产品在新版本中提出了一个门户下的多个一级栏目分别挂不同的产品进行销售的需求,在初步评估了需求的可行性后,这几天又对其中的细节做了一些分析,这里就来做一个基本的小结。以便以后遇到问题时能有点思路。

背景

首先,有必要来介绍一下项目背景,我们服务提供的是视频服务,而视频自然是区分了点播、回看和直播的,而对于用户而言,是否能播放视频,主要取决于能否获取到直播的播放串和资源唯一标识。这里我们分别记为cdnUrl和play_code。

当前的情况

1、直播:
用户如果想获取到直播的cdnUrl,只需要存在某个apk的授权信息,即当前情况下我们的apk是只挂了一个产品的,那么用户调用后台获取cdnUrl的时候,后台只需要进行授权的判断即可。如果有授权,就返回cdnUrl,如果没有,则不返回。而直播中直播流的play_code,一般而言,为了增加用户的体验效果,故play_code都是无条件返回的。故直播:对于用户而言,只需要获取到直播的cdnUrl就可以进行播放了

2、点播和回看:
而点播和回看相对而言要好一些,因为能做到单独鉴权,所以对于用户而言,不仅需要获取到cdnUrl,还需要走单独的点播和回看鉴权

存在的问题

接下来就要分析下我们做这个需求的时候遇到的问题:
1、由于一个门户下的多个栏目分别挂多个产品,如直播栏目1挂的是产品1,直播栏目2挂的产品2,而为了保证直播体验,我们在获取直播频道的时候是做了缓存的,所以也就是用户可以无条件的获取到play_code的,那么假如一个用户买了栏目1的产品,而没有买栏目2的产品,但是由于购买了产品1,所以用户是可以获取到直播的cdnUrl的,而这个cdnUrl又是通用的!那问题就来了,用户岂不是只需要拿到cdnUrl后,去拼接栏目2下挂的频道的play_code,岂不是也可以播放了吗?

解决的方案

方案一:
1、在保证用户获取直播节目单继续走缓存的情况下,我们只能在cdnUrl上面做文章,也就是说我们先返回给用户一个不完整的cdnUrl,(getSlbInfo信息接口)这个cdnUrl中是没有token参数的。(token用于cdn那边的校验)而用户如果想要播放某个频道的直播流时,需要单独调直播鉴权的接口,后端判断用户确实有授权信息后,才组装一个正确的cdnUrl给用户。且这个cdnUrl中的token是经过特殊的算法(结合了play_code、时间戳等),所以每个直播流获取到的cdnUrl中的token是唯一的,用户无法篡改,因为如果篡改的话,token会校验失败,从而无法播放。

2、该方案存在的缺点:
用户在切换频道后,需要进行单独走鉴权,因此整个用户的体验效果就差了。

方案二:(我们当前采用的)
1、方案二就有点投机取巧的意思,因为产品当前的需求只是一个门户下将直播、点播、回看作为3个产品去销售,所以没有涉及到多个直播栏目的情况,所以我的思路是:
a、用户登录成功后,调用获取slb信息接口,返回三个不完整的cdnUrl(直播、点播、回看)
b、当用户进入到直播栏目时,apk调用一个直播栏目鉴权接口,该接口的逻辑为判断用户是否有直播栏目关联的产品的授权的同时,如果有授权,那么需要返回一个完整的直播播放串cdnUrl给apk。当然,这个cdnUrl中的token也是我们后台算出来的。只是apk获取到完整的cdnUrl后,就能播放所有的直播频道了。同时保留了直播缓存的功能,且只需要调用一次,不需要进行每个频道的鉴权。
c、点播和回看同理,点播和回看鉴权通过后才返回完整的url给用户。
关于一个门户下多个直播栏目分别鉴权的思考

小结

其实要做到多个直播栏目挂多个产品的需求,我能想到的确实只有直播单独鉴权了。(后续如果有需求的话,可能还是要这样做)只是由于当前产品的需求,只需直播、点播、回看区分开来,所以投机取巧来做了处理。

如果有其他同学有更加好的方案能解决多个直播栏目挂多个产品的问题,希望能分享下,这里先谢过了。