2015-11-19 94 views
1

我正在构建php web应用程序。有一个演员需要访问应用程序,并生成链接到用电子邮件发送的页面。没有用户帐户。我能否通过此类电子邮件链接开发授权,并且不需要输入任何其他凭证?通过URL授权

预设定方案:

我对存储在数据库页面自动生成散列键,让我们说:

abc123abc

而且从用户的电子邮件中的网址:

http://example.com?page=Hello&**auth=abc123abc**

所以,当值匹配用户可以看到网页,否则不是。够好了。

问题

如何防止局面别人可以使用这个链接和登录信息(用户将其发送给朋友或保存为书签)。我只想通过点击邮件中的URL从电子邮件直接登录该用户。别无退路。有什么办法可以做到吗?

我会感谢您的任何sugestions的。

回答

1

用于所谓的一次共同的解决方案将是因为你说了类似的一个。你生成一个秘密密钥(例如一些哈希)。您可以将此散列存储到您的数据库或其他位置,并将该散列与有关可用于该键的基本信息相关联;如用户的ID,有效日期以及用户可以使用该散列执行的操作。

例子:

| Hash | User_id |  ValidUntil  | Action | 
| au3812j4 | 34 | 2015-11-19 23:52:50 | RESET_PW | 

然后你送出去的是提供真实散列的链接。 ('http://somedomain/?hash=au3812j4

当某人使用该链接时,检查散列,如果存在,则知道该散列(userid)的详细信息并将其从数据库中删除(因此它只能一次性使用)。

当用户获得该链接时(例如“密码重置”),您可以通过存储某些客户端信息(例如IP地址)来阻止用户将链接提供给其他人,并在使用链接时检查该信息,在我看来,没有好的解决方案。

+0

Sugessiton赞赏。但是你已经提到了“一次性使用”链接,并且有要求使其成为任何时间可用的**。用户知道他总是可以从他的链接去到他的电子邮件并打开页面。验证IP地址将阻止用户打开页面,例如从他的手机... – Twardy

0

您可以通过更改散列来防止多次使用此链接。如果你不想要它你可以把一些cookie和存储在Db中一起检查它登录。但它并不安全。

+0

那么,重新生成哈希将需要发送一个新的电子邮件。正如我在上面评论中所写的那样,如果不发送更多电子邮件,这将是非常棒的。只有一个链接。我开始怀疑我能以简单的方式实现它。 – Twardy

0

对于额外的安全性,您应该使令牌从CSPRNG产生一个128位的序列。

在服务器端,此店使用SHA-256。这可以防止任何人获得访问哈希使用您的链接之一。

链接发送

http://example.com?page=Hello&auth=<hex of 128 bit token> 

服务器端:

Page   Original Token      Single use token 
Hello  hex(SHA-256(128 bit token))  hex(SHA-256(128 bit token)) 

一次性使用令牌使用新的令牌,该令牌将被存储为一个cookie。一旦用户访问此页面,设置cookie,然后散列它服务器端。这是一个完全不同于原来的标记。

对于每次访问,请检查Single use token列。如果其中包含某些内容,请确保浏览器发送与散列时存储值相匹配的cookie。因此,任何获取原始链接的人都无法在没有发送cookie的情况下使用它。