现在项目有一个需求,在用户登录时就绑定本机设备标识,不允许在其它电脑上登录怎么做

新手上路,请多包涵

有代码提示更好,感谢各位大佬分享,本人后端

阅读 8.9k
9 个回答

讲道理是实现不了的,现在浏览器都在做防止追踪,你还想要设备ID。

接下来说说类似的功能:

  1. 只允许一个人(设备)登陆。比如说库里存个 token,每次都会判断你的 token 是不是保存的这一个 token。这样的话新登陆就会把之前登陆的踢掉。
  2. 通过 IP、UA、或者说浏览器指纹之类的来区分。异常的设备让用户二次确定(一般是短信验证码)是否添加到白名单。
  3. 如果说只是为了防住一些普通用户,那么你完全可以把一个唯一标识,存放在浏览器端,之后交互必须携带。

1.获取唯一标识

如果作为应用程序安装在移动设备或PC端,才可能有足够的访问权限来获得一些独特的东西。mac地址、设备序列号等等唯一信息

浏览器是最受限制的环境,无法从浏览器客户端获取任何类型的真正唯一且不可更改的标识符。这意味着没有 MAC 地址、序列号、IMSI 或任何其他内容。

2.自己生成id

从浏览器中获取设备唯一的 ID 在技术上是不可能的。

但是,有一种方法可以解决此问题。可以使用 JavaScript 生成长 ID,该 ID 在统计上保证是唯一的,例如 GUID(128 位整数)。然后可以再次使用 JavaScript 将此值存储在浏览器的 localStorage(或 cookie)中。下次用户打开此页面时,可以检查是否在浏览器 localStorage 中找到了唯一 ID。如果找到,就知道这是哪个设备。还可以使用其他信息来帮助识别设备,例如 IP 地址、设备的屏幕尺寸和其他可通过 JavaScript 读取的设置。

这些解决方案都不能保证有效。例如,如果浏览器处于私有模式,则 localStorage 中的数据将不会持久化。

这个要看是什么应用,如果是b/s应用,基本上直接操作是不可能的。因为浏览器没有权限,如果许可插件,可能获得相应权限,此外就是有一些类似的处理,比如一些高大上的应用(比如网银)会在本机上存储认证token。这一般结合手机认证之类进行二次认证,认证机器是许可使用的。 但这个并不是直接限制其它机器不能登录,而是说其它机器也要二次认证后才能许可登录。
如果是c/s应用,还有一定可能性。

额外的,我觉得在这样的应用策略上,利用二次认证过程是比较合理的,简单粗暴的其它机器就不能登录吧,需要一些救济策略在原始机器出现根本性故障时进行处理,否则这样的应用策略可用性会出问题的。

在本次登录用户的session 中保存一个 随机值

最后一次登录的用户把 随机值 和用户关联起来.
每次请求时, 判断 一下session中的值和用户关联的随机值是不是一样.

js做不到绑定电脑, 只能绑定一下登录的浏览器.

可以实现

对于APP或Desktop Client项目

就不讨论了,实现方法bing上搜搜,一大把,

WEB(B/S架构)项目

其实就是单一登录需求,先做这这几步:

  1. 用户访问网站的时候生成SessionID,记录在Cookie中
  2. 用户登录后,在服务器缓存中(如:redis)记录登录用户的ID和SessionID的映射列表
  3. 用户登出的时候,清除这个映射

那么,当在浏览器A登录后,在浏览器B登录时,有以下两种情况:

  1. 后端服务检测映射表中是否有这个用户的记录,如果没有,那么记录映射,并反馈登录成功
  2. 后端服务检测映射表中有这个用户的记录,那么判断映射表中记录是否匹配请求的SessionID:

    1. 如果匹配,那么允许登录
    2. 如果不匹配,那么拒绝登录,或者直接更新映射表(那么A下次接口请求的时候将不允许访问)

提供一些解决思路吧
这个问题的核心解决点是在如何生成客户端的唯一key的问题

  • 客户端,可以使用mac地址、设备唯一信息以及服务端分配的id作为计算参数,通过计算得到一个唯一的客户端id存放客户端本地
  • 浏览器端,可以考虑使用浏览器指纹,生成的id,存放cookie或localStorage中

解决key的生成问题后,还需要解决key意外丢失后的重新绑定的问题
整体来说,与其保证用户对登录端的绑定,不如考虑自签名ssl证书以及服务端与客户端的https的双向证书认证,加上浏览器插件或客户端,保证交互的保密性和权限的验证

这个很简单,绑定机器码,即 Mac 地址。

不知道是个啥样的项目,要这种需求。

不差钱,就去开发专用客户端和APP,或者定制一套全平台的自用浏览器,再给通讯加个密,想咋限制就咋限制。靠通用浏览器搞不定的。

不差网管,就做永久性session,禁止用户自己登录。用户第一次登录时,网管拿着临时分配的一次性秘钥,到指定的设备和指定的浏览器上给你登录,并做好记录。这样确保这个账号只有通过这个session才能访问。如果session意外失效了,那就让网管再跑一趟。

应该不行。

通过canvas指纹,获取浏览器的唯一id, 这是"浏览器"的唯一标识,不是设备的,如果需求是浏览设备的话可以使用。

function getCanvasFingerprint () {    
    var canvas = document.createElement('canvas');    
    var context = canvas.getContext("2d");    
    context.font = "18pt Arial";    
    context.textBaseline = "top";    
    context.fillText("Hello, user.", 2, 2);    
    return canvas.toDataURL("image/jpeg");
}
getCanvasFingerprint()

简单的写个字然后输出url, 就行了。

https://segmentfault.com/a/11...

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题