标签: cookie-httponly

Laravel 5.6 - 用于自助API的Passport JWT httponly cookie SPA身份验证?

注意:我在这个问题上有4个赏金,但下面没有提出的答案是这个问题所需要的答案.所需的一切都在下面的Update 3中,只是寻找要实现的Laravel代码.


更新3:此流程图正是我想要完成的流程,下面的所有内容都是原始问题以及一些较旧的更新.该流程图总结了所需的一切.

下面的流程图中的绿色部分是我知道如何做的部分.红色部分及其旁注是我正在寻找帮助完成使用Laravel代码.

在此输入图像描述


我已经做了很多研究,但是当使用Laravel和JWT httponly cookie进行自我消费的API时,信息总是很短而且不完整(大多数在线教程只显示JWT存储在本地存储中,这不是很安全).看起来像包含JWT by Passport的httponly cookie应该用于识别Javascript端的用户,当每次请求发送到服务器以验证用户是否是他们所说的用户时.

还有一些额外的东西需要全面了解如何使这个设置工作,我没有在一个教程中遇到这个包括:

  1. Laravel Passport(不是tymon auth)生成加密的JWT并将其作为httponly cookie发送,作为从JS端登录后的响应.使用什么中间件?如果刷新令牌添加更多安全性,如何实现?
  2. JavaScript(例如axios)api伪代码,用于调用auth端点,如何将httponly cookie传递给后端,以及后端验证令牌是如何有效的.
  3. 如果从多个设备登录单个帐户,那么设备被盗,如何撤销所有authed用户设备的访问权限(假设用户从他们可以控制的登录设备更改密码)?
  4. 什么会登录/注册,注销,更改密码,忘记密码控制器方法通常看起来像处理令牌的创建/验证/撤销?
  5. CSRF令牌集成.

我希望这个问题的答案可以作为一个易于遵循的指南,为未来的读者和那些正在努力寻找一个自我消费API的上述观点的答案.

更新1:

  1. 请注意我尝试过CreateFreshApiToken之前的功能,但是在撤销用户令牌时这不起作用(上面的第3点和第4点).这是基于此评论的核心laravel开发商,谈论时CreateFreshApiToken中间件:

由此中间件创建的JWT令牌不会存储在任何位置.它们不能被撤销或"不存在".它们只是为您的api调用提供了一种通过laravel_token cookie进行authed调用的方法.它与访问令牌无关.另外:您通常不会在发布它们的同一个应用程序上使用客户发出的令牌.您可以在第一方或第三方应用中使用它们.使用中间件或客户端发出的令牌,但不能同时使用两者.

所以似乎能够迎合第3点和第4点来撤销令牌,如果使用CreateFreshApiToken中间件则不可能这样做.

  1. 在客户端,Authorization: Bearer <token>处理安全的httpOnly cookie 似乎不是一种方法.我认为请求/响应应该包含安全的httpOnly cookie作为请求/响应头,像这样基于laravel文档:

使用此身份验证方法时,默认的Laravel JavaScript脚手架指示Axios始终发送X-CSRF-TOKEN和X-Requested-With标头.

headerswindow.axios.defaults.headers.common = {
    'X-Requested-With': 'XMLHttpRequest',
    'X-CSRF-TOKEN': (csrf_token goes here)
};
Run Code Online (Sandbox Code Playgroud)

这也是我寻找涵盖上述所有要点的解决方案的原因.道歉,我使用的是Laravel 5.6而不是5.5.

更新2:

似乎密码授予/刷新令牌授权组合是要走的路.使用密码授予/刷新令牌授权组合寻找易于遵循的实施指南.

密码授予: 此授权适用于与我们信任的客户交易,例如我们自己网站的移动应用.在这种情况下,客户端将用户的登录凭据发送到授权服务器,服务器直接发出访问令牌.

刷新令牌授权: 当服务器发出访问令牌时,它还会为访问令牌设置到期时间.当我们想要在访问令牌过期时刷新访问令牌时,使用刷新令牌授予.在这种情况下,授权服务器将在发出访问令牌时发送刷新令牌,该令牌可用于请求新的访问令牌.

我正在寻找一个易于实现,直接,全面的答案,使用密码授予/刷新令牌授权组合,涵盖上述原始5点的所有部分与httpOnly安全cookie,创建/撤销/刷新令牌,登录cookie创建,注销cookie撤销,控制器方法,CSRF等

csrf-protection laravel cookie-httponly laravel-5 laravel-passport

56
推荐指数
4
解决办法
4238
查看次数

Tomcat 7 sessionid cookie禁用http-only和secure

我有一个在Tomcat 7服务器上运行的Web应用程序.具有会话ID的cookie默认具有标志HttpOnlySecure.我想禁用JSESSIONIDcookie的这个标志.但它不会工作.我在我的web.xml文件中更改了这个,但它无法正常工作.

<session-config>
    <session-timeout>20160</session-timeout>
    <cookie-config>
        <http-only>false</http-only>
        <secure>false</secure>
    </cookie-config>
</session-config>
Run Code Online (Sandbox Code Playgroud)

我知道这是一个安全风险,因为攻击者能够窃取cookie并劫持会话,如果他找到了xss vuln.

JSESSIONID饼干应与HTTP和HTTPS与AJAX请求被发送.

编辑:

HttpOnly通过在conf/context.xml文件中添加以下选项成功禁用了该标志:

<Context useHttpOnly="false">
....
</Context>
Run Code Online (Sandbox Code Playgroud)

cookies httponly session-cookies tomcat7 cookie-httponly

27
推荐指数
1
解决办法
2万
查看次数

使用javax.servlet 2.5设置httponly cookie

这是一个设置cookie的函数:

public void addCookie(String cookieName, String cookieValue, Integer maxAge, HttpServletResponse response) {
    Cookie cookie = new Cookie(cookieName, cookieValue);
    cookie.setPath("/mycampaigns");
    cookie.setSecure(isSecureCookie);
    cookie.setMaxAge(maxAge);
    response.addCookie(cookie);
}
Run Code Online (Sandbox Code Playgroud)

我相信servlet 3.0,有一种方法可以直接执行此操作.不幸的是,我的组织在这个时刻使用2.5和UPGRADING不是一个选项.

有没有办法使用响应来设置cookie?这是我在网上找到的一个例子

response.setHeader("SET-COOKIE", "[SOME STUFF]" +"; HttpOnly")
Run Code Online (Sandbox Code Playgroud)

如果这是我想要的唯一方法,那么我将取代"[SOME STUFF]"以便我不会丢失我的功能当前存储在cookie中的任何数据?

java cookies cookie-httponly servlet-2.5

20
推荐指数
3
解决办法
4万
查看次数

使用HttpOnly cookie注销

我可以看到HttpOnlycookie 对安全性有好处,但是它们无法在没有服务器交互的情况下进行注销,对吧?1因此,当网络出现故障时,您无法注销并离开.我可以想象一个解决方法,但我想先问一下

  • 处理这种情况是否有意义
  • 这有什么标准的解决方案吗?

1假设你实际上正在使用它们.

cookies session web-services httponly cookie-httponly

12
推荐指数
1
解决办法
1545
查看次数

如何使用PHP或JS使用HttpOnly删除cookie

我有一个包含这些参数的cookie:

Name:   workgroup_session_id
Content:    ""
Domain: agrobman1.tsi.lan
Path:   /
Send for:   Any kind of connection
Accessible to script:   No (HttpOnly)
Created:    Wednesday, November 4, 2015 at 9:31:58 AM
Expires:    When the browsing session ends
Run Code Online (Sandbox Code Playgroud)

我试图使用此代码使用PHP删除cookie:

setcookie("workgroup_session_id", "\"\"", time() - 3600, "/", "agrobman1.tsi.lan", false, true);
Run Code Online (Sandbox Code Playgroud)

但我仍然无法删除它.有谁知道如何使用PHP或JS删除此类型的cookie?

javascript php cookies cookie-httponly

11
推荐指数
1
解决办法
1万
查看次数

如何在 Flask 中设置 HTTPONLY cookie

我阅读了为 Flask cookie 设置“安全”属性,但它用于设置安全 cookie,但我正在尝试设置 HTTPONLY cookie。它们都是某种安全的 cookie,但规格不同(阅读更多)。

cookie 需要保护,因为它是关于用户的登录信息。

python cookies flask cookie-httponly

9
推荐指数
2
解决办法
5228
查看次数

移动浏览器是否通过HTML5音频标签发送httpOnly cookie?

我尝试通过html5音频标签播放一些mp3文件.对于桌面而言,这非常适合(使用Chrome),但是当涉及到移动浏览器(也是Chrome(适用于Android))时,似乎存在一些困难:

我用一些密码保护了流,因此流媒体服务器需要找到一个特殊的身份验证cookie(spring security remember-me).但不知何故,移动浏览器在通过音频标签访问mp3流时不会发送此cookie.当我直接输入流URL到地址栏时,一切正常.

当我搜索我发现的丢失的cookie时,移动浏览器仍然发送一些cookie(例如JSESSIONID),但不是全部.进一步调查(使用PHP的快速PoC)显示移动浏览器似乎拒绝通过具有HttpOnly Flag设置的audio-tag发送cookie.所以我的问题是:

这是一个指定的行为,为什么移动和桌面版本(Chrome)之间存在差异,是否有一种方法可以控制客户端的行为?

mobile-browser html5-audio cookie-httponly

8
推荐指数
1
解决办法
2166
查看次数

HttpOnly cookie不是通过请求发送的

我想使用HttpOnlycookie,我在Java中设置如下:

...

Cookie accessTokenCookie = new Cookie("token", userToken);
accessTokenCookie.setHttpOnly(true);
accessTokenCookie.setSecure(true);
accessTokenCookie.setPath("/");
response.addCookie(accessTokenCookie);
Cookie refreshTokenCookie = new Cookie("refreshToken", refreshToken);
refreshTokenCookie.setHttpOnly(true);
refreshTokenCookie.setSecure(true);
refreshTokenCookie.setPath("/");
response.addCookie(refreshTokenCookie);

...
Run Code Online (Sandbox Code Playgroud)

我得到了客户端的cookie响应,但是当我发送下一个请求时,我没有请求cookie.也许我错过了一些东西,但据我所知,这些HttpOnlycookie必须由浏览器在每次请求(JavaScript无法访问这些cookie)时发送到定义的路径.

我有以下请求标题:

Accept:application/json, text/plain, */*
Accept-Encoding:gzip, deflate, br
Accept-Language:en-US,en;q=0.8,hu;q=0.6,ro;q=0.4,fr;q=0.2,de;q=0.2
Authorization:Basic dXNlcm5hbWU6cGFzc3dvcmQ=
Connection:keep-alive
Content-Length:35
content-type:text/plain
Host:localhost:8080
Origin:http://localhost:4200
Referer:http://localhost:4200/
User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36
X-Requested-With:XMLHttpRequest
Run Code Online (Sandbox Code Playgroud)

以及以下响应标头:

Access-Control-Allow-Credentials:true
Access-Control-Allow-Origin:http://localhost:4200
Access-Control-Expose-Headers:Access-Control-Allow-Origin, Content-Type, Date, Link, Server, X-Application-Context, X-Total-Count
Cache-Control:no-cache, no-store, max-age=0, must-revalidate
Content-Length:482
Content-Type:application/json;charset=ISO-8859-1
Date:Fri, 03 Feb 2017 13:11:29 GMT …
Run Code Online (Sandbox Code Playgroud)

java cookies jwt cookie-httponly angular

7
推荐指数
1
解决办法
4599
查看次数

Javascript不会设置XHR响应中收到的httpcookie

我有一个基本的SPA(反应)<-> API(网络核心2.2)设置,带有2个环境:dev和prod(小型项目)。API侧面有一个身份验证机制,用于检查httponly每个包含JWT的请求中cookie 的存在。

在开发环境中,它可以正常运行okey-dokey:,allowCredentials()并且已withCredentials = true在API和react应用程序中进行了设置。两者都在我的本地主机的不同端口上运行。

但是在生产环境中(单独的Heroku dynos),它不会设置httponlycookie:我可以使用我的凭据登录,响应标题包含带有jwt的cookie,但是我要发出的其他每个请求都将不包含cookie。 cookie标头在请求标头中!

然后我得到一个401 Unauthorized ...错误(这是逻辑上的)。我花了数小时尝试所有事情,这让我发疯。

我的简单身份验证XHR(原始)调用:

var request = new XMLHttpRequest()
request.open('POST', apiAuthenticateUser, true)
request.setRequestHeader('Content-type', 'application/json')
request.withCredentials = true
request.send(postData)
Run Code Online (Sandbox Code Playgroud)

Startup.cs在.net核心api中的配置:

var request = new XMLHttpRequest()
request.open('POST', apiAuthenticateUser, true)
request.setRequestHeader('Content-type', 'application/json')
request.withCredentials = true
request.send(postData)
Run Code Online (Sandbox Code Playgroud)

那就是我如何在api控制器动作响应中设置包含jwt的httponly cookie:

public void Configure(IApplicationBuilder app, IHostingEnvironment env) {
    if (env.IsDevelopment()) {
        app.UseDeveloperExceptionPage();
        IdentityModelEventSource.ShowPII = true;
    } else {
        app.UseHsts();
    }
    app.UseHttpsRedirection();

    app.UseCors(
        options …
Run Code Online (Sandbox Code Playgroud)

javascript request-headers response-headers cookie-httponly asp.net-core

7
推荐指数
1
解决办法
73
查看次数

React-native 中的 httpOnly cookie 用于 JWT 刷新令牌

我有一个express-node服务器。我发送 JWT 访问令牌作为响应,并仅通过 httpOnly cookie 发送 JWT 刷新令牌。在浏览器中使用它时,该刷新令牌会随每个后续请求自动发送。

但是当我尝试在 React Native 项目中使用它时,httpOnly cookie 不会自动保存在应用程序中,服务器也不会通过 api 请求获取任何 cookie。我认为react-native中没有可以保存httpOnly cookie的地方。有人建议我将其保存在 AsyncStorage 中,但由于它是 httpOnly cookie ,我无法通过 javascript 读取它,因此无法将其保存到任何地方。

React Native 不保存或处理仅 http 的 cookie 吗?

access-token jwt cookie-httponly react-native refresh-token

7
推荐指数
0
解决办法
5517
查看次数