Я пытаюсь пройти аутентификацию на Twitter, используя Ember Torii и Ember Simple Auth.Однако я не уверен, как правильно закрыть всплывающее окно аутентификации после того, как пользователь прошел аутентификацию.Мой код:
//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;
}
});
Насколько я понимаю, в случае аутентификации с использованием Twitter происходит следующее:
- Пользователь нажимает на элемент пользовательского интерфейса, чтобы инициировать поток аутентификации.Ember Torii создает всплывающее окно и выполняет запрос GET на
requestTokenUri
.Бэкэнд API генерирует oauth_token
, требуемый Twitter, и перенаправляет на страницу входа в Twitter с параметром запроса oauth_token
. - Пользователь входит в систему. В случае успешного входа Twitter затем перенаправляет всплывающее окно браузера нанастроенный
Callback URL
на бэкэнде API вместе с параметрами oauth_token
и oauth_verifier
. - API-интерфейсы внутреннего интерфейса
Callback URL
получают эти параметры и обменивают их на oauth_token
и oauth_token_secret
, которыехранится в бэкэнде.
Мой вопрос в основном, что происходит дальше и как правильно и безопасно закрыть всплывающее окно и инициализировать сеанс:
Мой бэкэндпреобразует токен, сгенерированный в 3 выше, во внутренний токен JWT и перенаправляет всплывающее окно браузера на torii/redirect.html?code=<<JWTTOKEN>>
.Однако, когда всплывающее окно браузера закрывается, Torii пытается повторно аутентифицировать данный токен, вызывая метод authenticate, который не требуется.Я использовал обходной путь, как показано выше в app/authenticators/torii.js
.Это правильно?Есть ли лучший способ?