簡體   English   中英

在Ember-simple-auth中附加firebase JWT

[英]Append firebase JWT in Ember-simple-auth

我正在嘗試在我的Ember App(2.10)中進行授權。 我的工作流程是

  1. 用戶點擊Facebook登錄按鈕,然后
  2. 我正在使用torii來獲取訪問令牌/ 我的用戶數據庫在firebase上 /
  3. 然后我將令牌與Facebook提供程序一起發送到firebase.auth。 它返回JWT令牌。

問題是我獲得了JWT令牌,現在我必須登錄我的emberapp。 我正在嘗試自定義torii身份驗證器。 我如何在ember應用程序中實現這一點。 以下是我的身份驗證器:

authenticate() {
return this._super(...arguments).then((torii) => {
    const serverTokenEndpoint = this.get('serverTokenEndpoint');
    return this.get('ajax').request(serverTokenEndpoint, {
        type: 'POST',
        data: {
        'type': torii.provider,
        'client_id': this.client,
        'token': torii.authorizationCode
        }
    }).then((token) => {
        var provider = new firebase.auth.FacebookAuthProvider();
        firebase.auth().signInWithPopup(provider).then(function(result) {
        // This gives Facebook Access Token.
        // JWT-token=result.user.Cd
        // JWT-token.iat at=result.user.ea.Sa
        // JWT-token-refresh = result.user.refreshToken
        console.log(result)
        //   token = result.user.Cd;
        // const expiresAt = this._absolutizeExpirationTime(result.user.ea.Sa);
        token = Ember.assign(token, { 'expires_at': result.user.ea.Sa });
        // this._scheduleAccessTokenRefresh(result.user.ea.Sa, expiresAt, result.user.refreshToken, torii);
        return Ember.assign(token, {'torii': torii});
        });
    });
    });  
}

在ESA倉庫中查看該指南 它涵蓋了torii和Github auth,但是一般概念對於您的用例是相同的。

@marcoow我確實嘗試過並進行身份驗證,但是當令牌過期時我無法刷新令牌。似乎這不是正確的方法,如何使用Firebase刷新令牌

export default ToriiAuthenticator.extend({
    torii: Ember.inject.service(),
    ajax: Ember.inject.service(),
    refreshAccessTokens: true,
    rejectWithResponse: false,

    restore(data) {
        return new RSVP.Promise((resolve, reject) => {
            const now = (new Date()).getTime();
            const refreshAccessTokens = this.get('refreshAccessTokens');
            if (!isEmpty(data['expires_at']) && data['expires_at'] < now) {
                // if (refreshAccessTokens) {
                this._refreshAccessToken(data['expires_in'], data['refresh_token']).then(() => {
                    resolve();
                }).catch(function(error) {
                    reject();
                });

                // } else {
                // reject();
                // }
            } else {
                if (!this._validate(data)) {
                    reject();
                } else {
                    this._scheduleAccessTokenRefresh(data['expires_in'], data['expires_at'], data['refresh_token']);
                    resolve(data);
                }
            }
        });
    },
    authenticate() {
        return new Ember.RSVP.Promise((resolve, reject) => {
            var provider = new firebase.auth.FacebookAuthProvider();
            firebase.auth().signInWithPopup(provider).then((result) => {
                var expires_in = this._absolutizeExpirationTime(result.user.ea.Sa);
                var expiresAt = result.user.ea.Sa;
                result = Ember.assign(result, { 'expires_at': expiresAt, 'expires_in': expires_in, 'access_token': result.user.Cd, 'refresh_token': result.refresh_token });
                resolve(result)
            });
            // const useResponse = this.get('rejectWithResponse');
            // const provider = new firebase.auth.FacebookAuthProvider();
            // firebase.auth().signInWithPopup(provider).then((result) => {
            //     let expires_in = result.user.ea.Sa;
            //     const expiresAt = this._absolutizeExpirationTime(expires_in);
            //     this._scheduleAccessTokenRefresh(expires_in, expiresAt, result.refresh_token);
            //     if (!isEmpty(expiresAt)) {
            //         result = Ember.assign(result, { 'expires_at': expiresAt, 'expires_in': expires_in, 'access_token': result.user.Cd, 'refresh_token': result.refresh_token });
            //     }
            //     // resolve(result);
            // }, (response) => {
            //     Ember.run(null, reject, useResponse ? response : response.responseJSON);
            // }).catch(function(error) {
            //     console.log(error);
            // });
        });
    },
    invalidate(data) {
        const serverTokenRevocationEndpoint = this.get('serverTokenRevocationEndpoint');
        return new RSVP.Promise((resolve) => {
            if (isEmpty(serverTokenRevocationEndpoint)) {
                resolve();
            } else {
                if (!Ember.isEmpty(data.access_token)) {
                    delete data.access_token;
                    firebase.auth().signOut();
                    resolve();
                }
            }
        });
    },
    _scheduleAccessTokenRefresh(expiresIn, expiresAt, refreshToken) {
        console.log('sched')
        const refreshAccessTokens = this.get('_refreshAccessTokens');
        if (refreshAccessTokens) {
            const now = (new Date()).getTime();
            if (isEmpty(expiresAt) && !isEmpty(expiresIn)) {
                expiresAt = new Date(now + expiresIn * 1000).getTime();
            }
            const offset = this.get('tokenRefreshOffset');
            if (!isEmpty(refreshToken) && !isEmpty(expiresAt) && expiresAt > now - offset) {
                run.cancel(this._refreshTokenTimeout);
                delete this._refreshTokenTimeout;
                if (!testing) {
                    this._refreshTokenTimeout = run.later(this, this._refreshAccessToken, expiresIn, refreshToken, expiresAt - now - offset);
                }
            }
        }
    },

    _refreshAccessToken(expiresIn, refreshToken) {
        console.log('refresh');
        const data = { 'grant_type': 'refresh_token', 'refresh_token': refreshToken };
        firebase.auth().currentUser.getToken(/ forceRefresh / true).then((response) => {
            return new RSVP.Promise((resolve, reject) => {
                // firebase.auth().currentUser.getToken(true).then((response) => {
                expiresIn = response.user.ea.Sa || expiresIn;
                refreshToken = response.refresh_token || refreshToken;
                const expiresAt = this._absolutizeExpirationTime(expiresIn);
                const data = assign(response, { 'expires_in': expiresIn, 'expires_at': expiresAt, 'refresh_token': refreshToken });
                this._scheduleAccessTokenRefresh(expiresIn, null, refreshToken);
                this.trigger('sessionDataUpdated', data);
                resolve(data);
            }, (response) => {
                warn(`Access token could not be refreshed - server responded with ${response.responseJSON}.`);
                reject();
            });
        });
    },

    _absolutizeExpirationTime(expiresIn) {
        if (!isEmpty(expiresIn)) {
            return new Date((new Date().getTime()) + expiresIn * 1000).getTime();
        }
    },

    _validate(data) {
        return !isEmpty(data['access_token']);
    }
});

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM