Setup是一个Ember前端,带有使用JSON api的rails后端。
一切都很顺利但有些问题确实出现了:
如何确保只有emberjs应用程序使用api?我不希望脚本编写程序来编写使用后端api的应用程序。
这一切看起来都很不安全,因为EmberJS应用程序会以.js文件的形式提供给客户端。
如果每个人都可以访问JS控制台,我如何确保用户真的是那个用户?
答案 0 :(得分:1)
您可以扩展RESTAdapter
并覆盖ajax
方法以将您的身份验证令牌包含在哈希中,并且您需要确保您的控制器验证该令牌。
在我的环境(.NET)中,我在我的应用呈现的文档的隐藏字段中有身份验证令牌,因此我的ajax
覆盖如下所示:
App.Adapter = DS.RESTAdapter.extend({
ajax: function(url, type, hash, dataType) {
hash.url = url;
hash.type = type;
hash.dataType = dataType || 'json';
hash.contentType = 'application/json; charset=utf-8';
hash.context = this;
if (hash.data && type !== 'GET') {
hash.data = JSON.stringify(hash.data);
}
var antiForgeryToken = $('#antiForgeryTokenHidden').val();
if (antiForgeryToken) {
hash = {
'RequestVerificationToken': antiForgeryToken
};
}
jQuery.ajax(hash);
}
});
令牌可以来自cookie或您定义的任何内容,只要您能够将其包含在请求标头中并让控制器对其进行验证(可能在before_filter
中),就足够了。 / p>
然后在Store中,传递新的适配器而不是默认的(即RESTAdapter)
App.Store = DS.Store.extend({
revision: 12,
adapter: App.Adapter.create()
})
注意: RESTAdapter#ajax
将更改为赞成或Ember.RSVP
,不推荐使用此覆盖。它必须在下一个版本之后更新,但对于版本12应该没问题。
答案 1 :(得分:0)
我使用Ember Simple Auth对用户身份验证和API授权有很好的效果。
我使用Oauth 2用户密码授予类型对用户进行身份验证,并通过承载令牌授权应用程序,该承载令牌必须在将来的所有API请求中发送。这意味着用户将其用户名/电子邮件和密码输入客户端应用程序,然后通过HTTPS发送到服务器以获取授权令牌和可能的刷新令牌。所有请求必须通过HTTPS来保护持有者令牌的披露。
我在app / initializers / auth中有这个:
Em.Application.initializer
name: 'authentication'
initialize: (container, application) ->
Em.SimpleAuth.Authenticators.OAuth2.reopen
serverTokenEndpoint: 'yourserver.com/api/tokens'
Em.SimpleAuth.setup container, application,
authorizerFactory: 'authorizer:oauth2-bearer'
crossOriginWhitelist: ['yourserver.com']
在app / controllers / login.coffee中:
App.LoginController = Em.Controller.extend Em.SimpleAuth.LoginControllerMixin,
authenticatorFactory: 'ember-simple-auth-authenticator:oauth2-password-grant'
在app / routes / router.coffee中:
App.Router.map ->
@route 'login'
# other routes as required...
在app / routes / application.coffee中:
App.ApplicationRoute = App.Route.extend Em.SimpleAuth.ApplicationRouteMixin
在app / routes / protected.coffee中:
App.ProtectedRoute = Ember.Route.extend Em.SimpleAuth.AuthenticatedRouteMixin
在templates / login.hbs中(我使用的是Ember EasyForm):
{{#form-for controller}}
{{input identification
label="User"
placeholder="you@example.com"
hint='Enter your email address.'}}
{{input password
as="password"
hint="Enter your password."
value=password}}
<button type="submit" {{action 'authenticate' target=controller}}>Login</button>
{{/form-for}}
为保护路线,我只是从App.ProtectedRoute
延伸或使用受保护的路线mixin。
您的服务器需要在上面配置的服务器令牌端点处理Oauth 2请求和响应。这很容易做到,Section 4.3 of RFC 6749描述了请求和响应,如果您的服务器端框架没有内置的Oauth2支持。但是,您需要在服务器上存储,跟踪和过期这些令牌。有一些方法可以避免存储令牌,但这超出了问题的范围:)
我已回答了后端问题并提供了用于用户身份验证,API授权和令牌身份验证的示例代码示例代码here