在 beforemodel 挂钩中使用 ember-simple-auth 进行身份验证
Authentification with ember-simple-auth in before model hook
我创建了一个应用程序,它需要在除一页 (mobile_messages) 之外的所有页面上使用 email/password 实施身份验证,其中需要使用刷新令牌进行身份验证。
我从 JWT 身份验证器扩展并覆盖身份验证方法。所以它看起来像:
authenticate (credentials, headers) {
return new Ember.RSVP.Promise((resolve, reject) => {
this.makeRequest('/auth/mobile_token', credentials, headers)
.then((response) => {
Ember.run(() => {
try {
const sessionData = this.handleAuthResponse(response)
resolve(sessionData)
} catch (error) {
reject(error)
}
})
}, (xhr) => {
Ember.run(() => { reject(xhr.responseJSON || xhr.responseText) })
})
})
}
在 mobile_messages 路线上,我尝试在模型挂钩之前进行身份验证。
beforeModel (transition) {
const authenticator = 'authenticator:api-token'
return this.get('session').authenticate(authenticator, {api_token: transition.queryParams.api_token}).then(() => {
}, (reason) => {
transition.abort()
this.get('notifications').error('Permission denied.', {
autoClear: true,
clearDuration: 6200
})
})
},
如果身份验证被拒绝,我需要留在 mobile_messages 路线上。但是当我使用错误的令牌进入路由时,我得到了下一个回溯:
Preparing to transition from '' to 'mobileMessages'
index.js:169 generated -> controller:mobileMessages {fullName:
"controller:mobileMessages"}
index.js:169 generated -> controller:aut`enter code here`henticated
{fullName: "controller:authenticated"}
index.js:169 generated -> controller:loading {fullName:
"controller:loading"}
router.js:300 Intermediate-transitioned into 'authenticated.loading'
index.js:169 generated -> route:messages-faxes {fullName:
"route:messages-faxes"}
router.js:190 Transitioned into 'login'
jquery.js:9600 POST http://localhost:3000/auth/mobile_token 500
(Internal Server Error)
看起来我在得到服务器响应之前被重定向了。我找不到谁从路线重定向我。我尝试检查 ApplicationRouteMixin,但只有当您单击注销按钮时,我才会调用 sessionInvalidated 方法。以及认证成功后的sessionAuthenticated。
如果我推送路由正确的令牌,那么我首先重定向到登录页面,然后 sessionAuthenticated 触发。之后我重定向到 baseURL。
如何解决重定向到登录页面的问题?
Ember Simple Auth 使用 Mixins 来确定如果用户 authenticated/unauthenticated.
应该发生的路由转换行为
例如,如果用户未通过身份验证,此 mixin 将不允许用户留在路由上:
import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin';
export default Ember.Route.extend(AuthenticatedRouteMixin, {
// route code
});
您可能想要使用的是 UnauthenticatedRouteMixin
This mixin is used to make routes accessible only if the session is
not authenticated (e.g., login and registration routes). It defines a
beforeModel method that aborts the current transition and instead
transitions to the routeIfAlreadyAuthenticated if the session is
authenticated.
在你的路由中包含 UnauthenticatedRouteMixin,如果会话未验证则需要访问它。例如:
// app/routes/login.js
import UnauthenticatedRouteMixin from 'ember-simple-
auth/mixins/unauthenticated-route-mixin';
export default Ember.Route.extend(UnauthenticatedRouteMixin);
加载挂钩出错。我在命名路线时犯了一个错误。我创建了名称为 loading 的路由以重定向到 messages-faxes 路由。在这种情况下,模型钩子 return promise ember 生成 route:application_loading 之前。在 application_loading 路由中,我 运行 转换到具有 UnauthenticatedRouteMixin 的消息传真路由。此 mixin 看到用户未通过身份验证并重定向到加载页面。
我创建了一个应用程序,它需要在除一页 (mobile_messages) 之外的所有页面上使用 email/password 实施身份验证,其中需要使用刷新令牌进行身份验证。 我从 JWT 身份验证器扩展并覆盖身份验证方法。所以它看起来像:
authenticate (credentials, headers) {
return new Ember.RSVP.Promise((resolve, reject) => {
this.makeRequest('/auth/mobile_token', credentials, headers)
.then((response) => {
Ember.run(() => {
try {
const sessionData = this.handleAuthResponse(response)
resolve(sessionData)
} catch (error) {
reject(error)
}
})
}, (xhr) => {
Ember.run(() => { reject(xhr.responseJSON || xhr.responseText) })
})
})
}
在 mobile_messages 路线上,我尝试在模型挂钩之前进行身份验证。
beforeModel (transition) {
const authenticator = 'authenticator:api-token'
return this.get('session').authenticate(authenticator, {api_token: transition.queryParams.api_token}).then(() => {
}, (reason) => {
transition.abort()
this.get('notifications').error('Permission denied.', {
autoClear: true,
clearDuration: 6200
})
})
},
如果身份验证被拒绝,我需要留在 mobile_messages 路线上。但是当我使用错误的令牌进入路由时,我得到了下一个回溯:
Preparing to transition from '' to 'mobileMessages'
index.js:169 generated -> controller:mobileMessages {fullName:
"controller:mobileMessages"}
index.js:169 generated -> controller:aut`enter code here`henticated
{fullName: "controller:authenticated"}
index.js:169 generated -> controller:loading {fullName:
"controller:loading"}
router.js:300 Intermediate-transitioned into 'authenticated.loading'
index.js:169 generated -> route:messages-faxes {fullName:
"route:messages-faxes"}
router.js:190 Transitioned into 'login'
jquery.js:9600 POST http://localhost:3000/auth/mobile_token 500
(Internal Server Error)
看起来我在得到服务器响应之前被重定向了。我找不到谁从路线重定向我。我尝试检查 ApplicationRouteMixin,但只有当您单击注销按钮时,我才会调用 sessionInvalidated 方法。以及认证成功后的sessionAuthenticated。
如果我推送路由正确的令牌,那么我首先重定向到登录页面,然后 sessionAuthenticated 触发。之后我重定向到 baseURL。
如何解决重定向到登录页面的问题?
Ember Simple Auth 使用 Mixins 来确定如果用户 authenticated/unauthenticated.
应该发生的路由转换行为例如,如果用户未通过身份验证,此 mixin 将不允许用户留在路由上:
import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin';
export default Ember.Route.extend(AuthenticatedRouteMixin, {
// route code
});
您可能想要使用的是 UnauthenticatedRouteMixin
This mixin is used to make routes accessible only if the session is not authenticated (e.g., login and registration routes). It defines a beforeModel method that aborts the current transition and instead transitions to the routeIfAlreadyAuthenticated if the session is authenticated.
在你的路由中包含 UnauthenticatedRouteMixin,如果会话未验证则需要访问它。例如:
// app/routes/login.js
import UnauthenticatedRouteMixin from 'ember-simple-
auth/mixins/unauthenticated-route-mixin';
export default Ember.Route.extend(UnauthenticatedRouteMixin);
加载挂钩出错。我在命名路线时犯了一个错误。我创建了名称为 loading 的路由以重定向到 messages-faxes 路由。在这种情况下,模型钩子 return promise ember 生成 route:application_loading 之前。在 application_loading 路由中,我 运行 转换到具有 UnauthenticatedRouteMixin 的消息传真路由。此 mixin 看到用户未通过身份验证并重定向到加载页面。