开放给合作方的网站,如何验证用户身份?

我们公司目前在和另一家公司合作开展业务,对方做的是在线学习平台,我方做的是在线电子书,现在不知道怎样和对方进行对接,所以来这里咨询一下。

目前规划的整体流程是这样:

  1. 对方平台用户在其平台上成功付费购买电子书之后,平台才会给用户显示我方网站上的电子书链接。
  2. 对方平台用户点击电子书链接,跳转到我方网站上。我方网站验证来源用户是否为对方平台用户,以及是否已购买所要阅读的电子书。
  3. 如果来源用户的确为对方平台用户,且已购买所要阅读的电子书,则向其展示电子书内容。
  4. 如果来源用户的确为对方平台用户,但没有购买所要阅读的电子书,则将该用户重定向至对方平台课程页面,课程页面上会有购买电子书的提示信息。
  5. 如果来源用户不是对方平台用户,那就说明是非法请求,直接丢掉。

其中需要说明的是,对方平台上每个用户的信息,包括其所购买的电子书,都由对方平台记录。

按这个流程来实施的话,我方网站要验证来源用户,具体的技术细节应该是怎样的?

我之前构思的一种方案,是对方在向我方网站跳转的 URL 中附带用户ID、图书编号及JWT。其中 JWT 由“用户ID + 图书编号 + 用户IP”生成。

然后我方网站调用对方的用户验证接口,将用户ID、图书编号、用户IP及JWT回传,由对方验证“用户ID + 图书编号 + 用户IP”的组合是否能够生成同样的 JWT,并验证该用户是否在其平台上购买了该图书。

但是这种方案将 JWT 在 URL 中明文传输,安全性是否欠妥?可是 GET 请求又不像 POST 请求那样能在 body 中附加信息,所以很是头疼。

最后,这种方案不合适的话,采用什么样的方案更合适?还望大家不吝赐教,谢谢先。

阅读 2.6k
3 个回答

那你们可以简化逻辑,你们就假设自己是一个纯粹的电子书内容提供商,给认证的机构组织提供电子书内容在线浏览服务,只需要一个api即可完成业务流程。

api/third/ebookcontent?appid=APPID&sid=USERID&bid=BOOKID&nonce=NONCE&signature=SIGNATURE

AppID: 发放给认证可信的第三方的凭证ID(如果只有对方一家,可以直接忽略,不过为了迷惑潜在威胁,你还是加上一个哈哈哈哈)
AppSercet:发给认证可信的第三方的App秘钥(对方仅保存在服务器端不对外传输)
UserID: 双方协调的统一ID形式(可以公开的用户ID编号形式)
BookID: 你方提供的图书编号
Nonce: 随机数
Signature: 上述参数+AppSercet,经过加密算法得到的签名值

你们仅记录用户ID对应用户是否购买,何时购买和其他你们协商需要你们保存的数据,请求时判断是否购买即可,购买图书的可以通过另外加一个第三方订购在线电子书服务的api来做。

api/third/ebookbuy?appid=APPID&sid=USERID&bid=BOOKID&nonce=NONCE&signature=SIGNATURE

如果你们是完全信任他们的,或者直接签约按时间不计量(买断指定书籍,不限制对方售卖次数),可以不自己存用户订单数据,只检查图书ID是否是该第三方的授权范围内的即可

大致是这样,具体还得看合作协议怎么考虑的,授权书籍范围、授权方式、计费方式,次数限制

提供对方接口(服务器到服务器调用),参数 用户ID、图书编号、用户IP及JWT,返回一个 一次性访问授权 token
对方 需要跳转的时候,先调用接口,获取 一次性 token,然后跳转 url 上带这个 token,你本地验证即可

  1. [学习平台]生成一套非对称加密的密钥,将公钥提供给[电子书]
  2. [学习平台]在用户完成付款后,将 orderID, userId, bookId等信息通过私钥加密生成token
  3. 携带token跳转到[电子书]
  4. 使用公钥将token解密,拿到结果
  5. [学习平台]提供一个查询订单接口,用于获取订单的信息
  6. [电子书]通过解密出的信息查询[学习平台]提供的接口,拿到订单结果
  7. 通过结果执行不同回调
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题