我是一名经验丰富的(55岁以上)程序员,但是在ember和js中总共有一个菜鸟。我正在尝试使用embla-cli插件ember-cli-simple-auth,ember-cli-simple-auth-oauth2以及simplelabs教程中的剪切和粘贴来使用简单的身份验证页面。
我在控制台中收到以下内容:
DEPRECATION:不推荐使用LoginControllerMixin。直接使用会话的authenticate方法。
和:
DEPRECATION:不推荐使用AuthenticationControllerMixin。直接使用会话的authenticate方法。
解决方案可能是微不足道的,但我已经追了好几个小时并且在达到死胡同之前深入了解javascript。导致这些错误的代码是:
从'simple-auth / mixins / login-controller-mixin'导入LoginControllerMixin;
export default Ember.Controller.extend(LoginControllerMixin,{ authenticator:'simple-auth-authenticator:oauth2-password-grant' });
在凉亭代码中的某处调用ApplicationControllerMix。
在我通过将一些旧的html / ruby / pascal代码翻译成js来“重新发明轮子”之前,任何人都可以帮助我“直接使用会话的身份验证方法。”?
感谢。
答案 0 :(得分:1)
我觉得你很痛苦。我花了几周的时间试图解决这个问题。问题的一个很大一部分是在过去几年中发生了很多变化,并且有很多代码示例已经过时或者不能协同工作。将各个部分连贯地整合在一起并找出一个人不需要做的事情真的很难。
那就是说,请记住,我也是一个n00b。我所做的似乎工作正常,但我不知道是否有更好的方法。
此外,您尝试做的事情可能与我所做的不同。我的应用使用Simple-Auth-Torii对google(和twitter,fb等)进行身份验证,然后将返回的身份验证代码与身份验证令牌进行交换。最后一部分发生在服务器上。因此,在会话进行身份验证后,我会将身份验证代码传递给服务器并返回身份验证代码。
// routes/login.js
import Ember from "ember";
import ENV from "../config/environment";
export default Ember.Route.extend({
setupController: function(controller, model) {
controller.set("errorMessage", null);
},
actions: {
googleLogin: function() {
var _this = this;
// Using "session's authenticate method directly" right here
this.get("session").authenticate("simple-auth-authenticator:torii", "google-oauth2")
.then(function() {
// We're now authenticated. The session should now contain authorization
// code from provider. We now need to exchange that for an auth token.
var secureData = _this.get("session.content.secure");
// call server to initiate token exchange from provider
var exchangeData = {
authorizationCode: secureData.authorizationCode,
redirectUri : secureData.redirectUri,
provider : 'google'
};
// sends ajax request to server, which will in turn call provider
// with authentication code and receive auth token
_this.tokenService.fetch(exchangeData).then(function(response) {
if (response.success) {
_this.set("session.content.secure.access_token", response.data.token);
_this.set("session.content.secure.userData", response.data.user);
// take user somewhere ...
_this.transitionTo("data_sets");
}
else {
// set an error message, log the response to console, whatever, but
// we need to invalidate session because as far as simple-auth
// is concerned we're already authenticated. The following logs the user out.
_this.get("session").invalidate();
}
}, function(error) {
console.log("tokenService.fetch error", error);
_this.get("session").invalidate();
});
}, function(error) {
console.log("simple-auth-authenticator:torii error", error);
_this.get("session").invalidate();
});
},
twitterLogin: function() {
// etc.
}
}
});
将用户注销也会直接使用会话。
{{!templates/application.hbs}}
<ul class="nav navbar-nav navbar-right">
{{#if session.isAuthenticated}}
<li><button {{ action 'invalidateSession' }} class="btn btn-sm">Logout</button></li>
{{/if}}
...
</ul>
// routes/application.js
import Ember from "ember";
import ENV from "../config/environment";
import ApplicationRouteMixin from "simple-auth/mixins/application-route-mixin";
export default Ember.Route.extend(ApplicationRouteMixin, {
actions: {
// action is globally available because in application route
invalidateSession: function() {
// the most basic logout
this.get("session").invalidate();
return;
// If you need to invalidate also on the server do something like:
//
// var _this = this;
// return new Ember.RSVP.Promise(function(resolve, reject) {
// var params = {
// url : ENV.logoutEndpoint,
// type : "POST",
// dataType : "json"
// };
// Ember.$.ajax(params).then(function(response) {
// console.log('session invalidated!');
// console.dir(response);
// _this.get("session").invalidate();
// });
// });
}
}
});
答案 1 :(得分:1)
我遇到了同样的弃用问题。我认为这个可爱的登录控制器的代码片段可以做,它比你问的要多一点,但我希望它仍然可以理解。我用它设计它,它几乎一样,除非我这样使用它:authenticate('simple-auth-authenticator:devise', credentials)
import Ember from 'ember';
export default Ember.Controller.extend({
actions: {
authenticate: function() {
// identification and password are the names of the input fields in the template
var credentials = this.getProperties('identification', 'password');
if (!credentials.identification || !credentials.password) {
return false;
}
this.get('session').authenticate('simple-auth-authenticator:oauth2-password-grant', credentials).then(function() {
// authentication was successful
}, function(errorMessage) {
// authentication failed
});
}
}
});