2015-10-10 36 views
9

是否可以驗證用戶身份不同的角色僅僅海槽graphql服務器結合中繼&反應?Relayjs Graphql用戶認證

我環顧四周,並沒有找到有關此主題的很多信息。

在我的當前設置,以不同的角色登錄功能,目前仍在低谷傳統的REST API ...(「安全」與JSON網絡令牌)。

回答

6

我做到了我的應用程序之一,基本上你只需要一個用戶界面,在第一根查詢這一個返回NULL,如果沒有人登錄,那麼你就可以登錄突變傳遞憑據更新。 主要問題是獲取後繼請求中的cookie或會話,因爲它不處理請求中的cookie字段。

這裏是我的客戶突變:

export default class LoginMutation extends Relay.Mutation { 
    static fragments = { 
    user:() => Relay.QL` 
     fragment on User { 
     id, 
     mail 
     } 
    `, 
    }; 
    getMutation() { 
    return Relay.QL`mutation{Login}`; 
    } 

    getVariables() { 
    return { 
     mail: this.props.credentials.pseudo, 
     password: this.props.credentials.password, 
    }; 
    } 
    getConfigs() { 
    return [{ 
     type: 'FIELDS_CHANGE', 
     fieldIDs: { 
     user: this.props.user.id, 
     } 
    }]; 
    } 
    getOptimisticResponse() { 
    return { 
     mail: this.props.credentials.pseudo, 
    }; 
    } 
    getFatQuery() { 
    return Relay.QL` 
    fragment on LoginPayload { 
     user { 
     userID, 
     mail 
     } 
    } 
    `; 
    } 
} 

,這裏是我的架構側突變

var LoginMutation = mutationWithClientMutationId({ 
    name: 'Login', 
    inputFields: { 
    mail: { 
     type: new GraphQLNonNull(GraphQLString) 
    }, 
    password: { 
     type: new GraphQLNonNull(GraphQLString) 
    } 
    }, 
    outputFields: { 
    user: { 
     type: GraphQLUser, 
     resolve: (newUser) => newUser 
    } 
    }, 
    mutateAndGetPayload: (credentials, { 
    rootValue 
    }) => co(function*() { 
    var newUser = yield getUserByCredentials(credentials, rootValue); 
    console.log('schema:loginmutation'); 
    delete newUser.id; 
    return newUser; 
    }) 
}); 

讓我的用戶通過網頁刷新記錄的我把我自己的要求,並填補它與一個cookie現場......這是現在,使其工作的唯一途徑...

+0

謝謝,我會嘗試明天。你是否在getUserByCredentials函數中封裝了「我發送自己的請求並填充cookie字段」? – Seneca

+0

實際上,這實際上是繼電器的問題,您無法在發佈請求下訪問cookie。我一直等到突變返回客戶端,我發送一個全新的自制獲取請求與憑據來填充我的cookie ...,然後刷新你通過您的HTML發送用戶ID,並在您傳遞該用戶ID的根查詢。 – Duduche

+2

在沒有重置功能的情況下([Relay目前沒有](https://github.com/facebook/relay/issues/233)),通過Relay本身做這件事可能不是一個好主意。由於Relay在內部緩存GraphQL數據,並且該數據可能是用戶特定的,因此您需要一種在註銷或登錄時使緩存失效的方法。目前,我們建議人們在發生任何一個事件時都會進行整頁刷新。 – wincent