我正在尝试使用Ember Torii和Ember Simple Auth针对Twitter进行身份验证。但是,我不确定用户通过身份验证后如何正确关闭身份验证弹出窗口。我的代码:
caldav.icloud.com
据我了解,使用Twitter进行身份验证时会发生以下情况:
//app/authenticators/torii.js
import {inject as service} from '@ember/service';
import Torii from 'ember-simple-auth/authenticators/torii';
export default Torii.extend({
torii: service(),
ajax: service(),
authenticate() {
const ajax = this.get('ajax');
return this._super(...arguments).then((data) => {
console.log('Authorization data:');
console.log(data);
if(data.provider === "twitter" && data.code) {
return {
accessToken: data.code,
provider: data.provider
};
}
//This is for OAuth2 providers e.g. Facebook
return ajax.request(
'http://localhost:8080/api/1/auth', {
type: 'POST',
dataType: 'json',
crossDomain: true,
contentType: 'application/json',
data: {'provider': data.provider, 'authorizationCode': data.authorizationCode}
}).then((response) => {
return {
accessToken: response.token,
provider: data.provider
};
});
});
}
});
//config/environment.js
.......
providers: {
'facebook-oauth2': {
apiKey: 'xxxxxxxxxxxxxx',
scope: 'public_profile,email'
},
'twitter': {
requestTokenUri: 'http://localhost:8080/api/1/auth/twitter/'
},
//app/torii-providers/facebook-oauth2.js
import { computed } from '@ember/object';
import FacebookOauth2Provider from 'torii/providers/facebook-oauth2';
export default FacebookOauth2Provider.extend({
redirectUri: computed(function() {
return [
window.location.protocol,
'//',
window.location.host,
'/torii/redirect.html'
].join('');
}),
fetch(data) {
return data;
}
});
发出GET请求。 API后端会生成Twitter所需的requestTokenUri
,并使用oauth_token
作为查询参数重定向到Twitter登录页面。oauth_token
和Callback URL
参数重定向到API后端上已配置的oauth_token
。oauth_verifier
接收这些参数,并与存储在后端中的Callback URL
和oauth_token
交换这些参数。我的问题基本上是,接下来会发生什么以及如何干净安全地关闭弹出窗口并初始化会话:
我的后端将上面3中生成的令牌转换为内部JWT令牌,并将浏览器弹出窗口重定向到oauth_token_secret
。但是,当浏览器弹出窗口关闭时,Torii尝试通过调用authenticate方法来重新认证给定令牌,这不是必需的。我已经在torii/redirect.html?code=<<JWTTOKEN>>
中显示了一种变通方法。它是否正确?有更好的方法吗?