我的Rails应用程序使用Devise进行身份验证.它有一个姐妹iOS应用程序,用户可以使用他们用于Web应用程序的相同凭据登录iOS应用程序.所以我需要某种API进行身份验证.
这里有很多类似的问题指向本教程,但它似乎token_authenticatable已经过时了,因为该模块已从Devise中删除,并且某些行会抛出错误.(我正在使用Devise 3.2.2.)我试图根据那个教程(和这个教程)推出自己的教程(但是这个),但我对它没有100%的信心 - 我觉得我可能会有一些东西被误解或错过了.
首先,按照这个要点的建议,我authentication_token在我的users表中添加了一个text属性,以及以下内容user.rb:
before_save :ensure_authentication_token
def ensure_authentication_token
if authentication_token.blank?
self.authentication_token = generate_authentication_token
end
end
private
def generate_authentication_token
loop do
token = Devise.friendly_token
break token unless User.find_by(authentication_token: token)
end
end
Run Code Online (Sandbox Code Playgroud)
然后我有以下控制器:
api_controller.rb
class ApiController < ApplicationController
respond_to :json
skip_before_filter :authenticate_user!
protected
def user_params
params[:user].permit(:email, :password, :password_confirmation)
end
end
Run Code Online (Sandbox Code Playgroud)
(注意我application_controller有这条线before_filter :authenticate_user!.)
API/sessions_controller.rb
class Api::SessionsController < Devise::RegistrationsController
prepend_before_filter :require_no_authentication, :only …Run Code Online (Sandbox Code Playgroud) 我正在开发一个Web API.身份验证是通过cookie.所有端点都JSON在请求正文中接收参数.
我是否需要实施CSRF token保护它们?这怎么可以被利用?是否可以通过普通<form>元素发送JSON ?
攻击者有可能拥有这样的东西吗?
<form type="application/json" method="POST">
<input name="json" value="{ my json code here }">
<input type="submit">Send</input>
<form>
Run Code Online (Sandbox Code Playgroud) 我们正在将我们的前端转移到一个单独的项目(Django之外).这是一个Javascript单页面应用程序.
其中一个原因是让我们的前端开发人员更容易完成他们的工作,而不必在本地运行整个项目 - 包括API.相反,我们希望他们能够与我们设置的测试API进行通信.
我们已经设法解决了大部分CORS/CSRF问题.但是现在我们遇到了一些我无法在任何地方找到解决方案的东西,尽管阅读了大量文档和SO答案.
前台和API是从不同的域(在开发过程中提供服务localhost和test-api.example.com).到目前为止,虽然从同一个域提供服务,但前端已经能够从csrftokenAPI(Django)设置的cookie中获取CSRF令牌.但是,当从不同的域提供服务时,frontend(localhost)无法访问API(api-test.example.com)的cookie .
我正在试图找到解决这个问题的方法,以某种方式将CSRF令牌传递给前端.Django文档建议X-CSRFToken为AJAX请求设置自定义标头.如果我们在每个响应中同样为CSRF令牌提供标头并且(通过Access-Control-Expose-Headers)允许前端读取此标头,我们是否会破坏CSRF保护?
鉴于我们已经为API正确设置了CORS(即只允许某些域对API进行跨域请求),第三方站点上的JS应该无法读取此响应头,因此无法做出妥协AJAX请求我们的用户背后,对吧?还是我错过了一些重要的事情?
还是有另一种更好的方法来实现我们想要的东西吗?
我读了很多:
但是,我还无法理解我们的端点(// graphql)是否受到这种类型的攻击的保护,或者是否有必要使用以下解决方案来保护它:https : //github.com/expressjs/csurf。
我不清楚的是在这里:https : //github.com/pillarjs/understanding-csrf他们说:
当您错误地使用CSRF令牌时:...将它们添加到JSON AJAX调用中如上所述,如果您不支持CORS并且您的API严格是JSON,则将CSRF令牌添加到您的AJAX调用中绝对没有意义。
如果我们将端点限制为仅使用Content-Type: application/json,那么我们安全吗?
伪造的POST请求可以由不受信任的网站构建,方法是创建表单并将其发布到目标站点.但是,此POST的原始内容将由浏览器编码为以下格式:
param1=value1¶m2=value2
Run Code Online (Sandbox Code Playgroud)
是否有可能不受信任的网站构造包含任意原始内容的伪造POST - 例如字符串化JSON?
{param1: value1, param2: value2}
Run Code Online (Sandbox Code Playgroud)
换句话说: 网站可以使浏览器将任意内容发布到第三方域吗?
csrf ×4
security ×3
javascript ×2
api ×1
api-design ×1
cors ×1
devise ×1
django ×1
graphql ×1
graphql-js ×1
json ×1
post ×1