我最近一直在考虑如何正确地使用我的webframework/application-stack.我正在慢慢转向scala和函数式编程(来自Python和CherryPy).因此,调查Play是很自然的,因为它是最广泛支持的框架(现在即使是Typesafe也采用了它).如果我在这里遗漏了什么,请随意纠正我.
因此,游戏真正拥抱无状态webapps的想法,我很难在身份验证和授权方面解决它.现在经过一些在线挖掘(基于表单的网站身份验证的权威指南)后,我得出的结论是,必须对我的后端(JSON-RPC或其他)的每次调用进行身份验证和授权,远离旧会话 -饼干的想法.
现在有什么最好的方法来实现今天的技术?
那怎么样:
我想到了"简单"DigestAuth,因为它被证明并且广泛存在但是它对旧的和生锈的基本认证有类似的感觉.
谢谢!
在构建网站时,我已经开始通过解决一些相当容易的问题来提高我的OOP技能.所以它从一个登录系统开始,我已经按照youtube上的一个教程,帮助我创建了一个Login类,但是随着它的继续,它引起了许多疑虑(顺便说一句.代码是100行所以我会传递它粘贴它).
所以在这个Login类中,有一些验证方法等,但它有一个会话验证点,在构造之前给定的参数,它不能被使用(至少在这个类范围内):
$this->_username = ($this->_login)? $this->filter($_POST['username']) : $_SESSION['username'];
$this->_password = ($this->_login)? $this->filter($_POST['password']) : '';
$this->_passmd5 = ($this->_login)? md5($this->_password) : $_SESSION['password'];
Run Code Online (Sandbox Code Playgroud)
所以在这种情况下,当没有设置会话变量时,我不能使用verifySession()方法(例如,不同的记录用户应该在主页上看到什么).
所以我的问题是 - 设计是否正确,我应该如何构建其他登录系统:在每个页面上登录验证并注销 - 如果它们中的每一个都处于单独的类中(那么方法,在特定类中重复,我应该继承它们吗?我意识到OOP有不同的方法,但是有什么特别的,我应该作为一个初学者(这将帮助我理解最好的oop).
在这种流行的持久登录Cookie 解决方案中,该解决方案涉及生成随机的128位“令牌”以保存在用户的Cookie中,Jens Roland建议:
并且不要将永久性登录COOKIE(令牌)存储在您的数据库中,仅是一种哈希!登录令牌是等效的密码,因此,如果攻击者将您的手放在您的数据库上,则他/她可以使用这些令牌登录到任何帐户,就像它们是明文登录密码组合一样。因此,在存储持久性登录令牌时,请使用强盐散列(bcrypt / phpass)。
但是,当您对Cookie令牌进行加密时,您将如何对照数据库中的加密令牌来检查Cookie令牌以确认Cookie登录有效?(因为加密始终使用随机盐)?
换句话说,您将无法对Cookie令牌进行bcrypt加密,然后在数据库中寻找匹配项,因为您将永远找不到匹配的令牌,因此,如何按照推荐的解决方案将其与数据库中的哈希版本进行实际匹配(“服务器保留一个由数字->用户名关联组成的表,该表将被查找以验证cookie的有效性。
编辑:
请记住,按照上面链接的推荐解决方案,单个用户可以为不同设备使用多个 Cookie /令牌。我提到这是因为提交了一个答案(此答案已被删除),它假定每个用户只有一个令牌。
目前我session.gc_maxlifetime的设置为默认值,因此为1440秒.
我想设定maxlifetime为一个月,4*7*24*60*60秒.但是,我在php.net上看到最大值session.gc_maxlifetime是65535.
难道不可能将我设置maxlifetime为65535秒以上吗?
我们有一个基于cookie的auth的常规Web应用程序,现在我们想要分割前端和后端(api)以便拥有第三方公共API.所以我们的后端将在一个域上并在另一个域上前端.
对于授权,我们希望使用JWT切换OAuth 2.在这种情况下,我们的前端应用程序将不得不使用access_token而不是cookie会话,它带来了一个很大的问题:
如何保持登录状态 - 臭名昭着的"记住我"复选框(来自基于表单的网站身份验证的第二部分)
从OAuth2的角度来看,我们的前端应用程序将在资源所有者密码凭据授予和隐式授权之间使用某些东西.它更接近密码凭证授予,因为我们仍将使用通常的登录表单,并且不会将用户重定向到另一个域以便登录.同时它更接近隐式授权,因为它将全部仅限浏览器基于JavaScript的时间access_token将保存在浏览器中.
RFC 说如果你使用隐式授权,授权服务器不能发出刷新令牌,而我的问题是,如果你没有真正使用3-d party OAuth而你自己的api,它在这个用例中是否仍然有效?本能地,我觉得refresh_token在浏览器中有一个安全漏洞,并想与你们确认,但这refresh_token似乎是持久登录工作方式与我们使用cookie一样的唯一方法.
如果我可以使用refresh_token仅浏览器应用程序,OpenID规范仍然无法回答我的问题
refresh_token只提供access_type=offlinerefresh_token与混合流程refresh_token混合流动的一些前景,但并不精确UPD2感谢@reallifelolcat
看起来OpenID Connect没有明确支持资源所有者密码凭据授权,这意味着您必须将用户重定向到OpenID Connect服务器才能执行登录.您是否知道是否有其他方法可以通过OAuth 2.0对用户凭据进行身份验证?
我相信分裂api和前端这些日子变得越来越普遍,如果你分享如何解决这个持久登录问题,如果你完全放弃并强迫用户每X周重新登录,我会很感激.
谢谢!
我正在制作一个登录页面。所以我已经可以登录到另一个页面了。然后在我的登录页面中,我需要将记住我复选框和 PHP。那么我需要在代码中的哪个部分放置我的“记住我”代码?请帮我。
这是 login1.php
<?php
session_start();
//database connection
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "lala";
// Create connection
$link = mysql_connect($servername,$username,$password) or die("Could not connect");
$db= mysql_select_db("$dbname",$link) or die ("Could not select database");
$login = $_POST['login'];
$password = md5($_POST['password']);
$rememberme = $_POST['remember_me'];
$result = mysql_query("SELECT * from admin WHERE working_id = '$login' and password = '$password'");
$count = mysql_num_rows($result);
if($count==1)
{
//check remember me is on or off
//if off then session login
//else add …Run Code Online (Sandbox Code Playgroud) 我有一个遗留的ASP.NET webforms应用程序,用户通过服务器端处理的表单登录.如果输入的用户名+密码与数据库中的凭证匹配,我会在会话中设置一些值(例如,当前用户ID)并在Response.Redirect之后执行.我也创建了一个HttpCookie,用于"下次访问时自动重新启动"功能.
目前,我还在该Web应用程序中添加了WebApi支持.我设法实现了令牌身份验证,允许我在客户端登录.
如何结合两种身份验证方法?我希望用户输入一次凭据,在服务器端进行身份验证,在客户端进行身份验证后将用户重定向到另一个页面.
我的 JS 代码(举个例子,可能有一些语法错误)
$(document).on('click','#btnEdit',function(e){
var id = $("#inp_id").val(), ps = $("#inp_ps");
$.ajax({
type: 'POST',
url: 'http://example.php',
data: {act:'#LogIn',id:id,ps:ps},
success: function(response){
if($.trim(response) === "success"){
alert("Login Successful");
}
else{
alert("Invalid ID or Password");
}
}
});
});
Run Code Online (Sandbox Code Playgroud)
在 php 里面
if($_POST[act] == "#LogIn"){
$userid = Encrypt($_POST[id],$key1);
$userps = hashPS($_POST[ps],$salt);
//query...
if(result > 0){
$_SESSION['id'] = Encrypt($userid,$key2);
$_SESSION['token'] = //random code;
}
}
Run Code Online (Sandbox Code Playgroud)
我的问题:
有没有办法使代码安全?因为我认为攻击者可以编写自己的脚本并将数据发送到 php 以获取和 id。或者也许使用ajax登录和注册只是一个坏主意。
场景:
session题:
这是一个足够强大的安全措施本身,还是我应该
========
(顺便说一句,在我研究这个问题时,这个wiki是一个很棒的读物.)