2015-10-10 22 views
9

&との組み合わせでgraphqlサーバだけで異なる役割を持つユーザを認証することは可能ですか?Relayjs Graphqlユーザ認証

私は周りを見回し、このトピックに関する多くの情報を見つけることができませんでした。

私の現在の設定では、さまざまな役割を持つログイン機能は、従来のREST API(json Webトークンで '安全')に移行しています。

答えて

6

私は自分のアプリの中でそれをやったのですが、基本的にはユーザーインターフェイスが必要です。誰もログインしていない場合は最初のルートクエリでnullを返し、ログインミューテーションで認証情報を渡して更新できます。 主な問題は、要求の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; 
    }) 
}); 

私のユーザーを維持するために、私は自分の要求を送信し、クッキーとそれを埋めるページの更新によってログに記録フィールド...これは今のところそれを動作させる唯一の方法です...

+0

ありがとう、私は明日それを試してみます。 getUserByCredentials関数で「自分のリクエストを送信し、Cookieフィールドに入力してください」ということをカプセル化していますか? – Seneca

+0

実際これは実際にリレーの問題です。あなたはポストリクエストの下でクッキーにアクセスできません。私は突然変異がクライアント側を返すまで待って、私は自分のクッキーを埋めるために資格を持った新しい手作りのリクエストを送ります...そして、あなたのHTMLを介してuserIDを送り、あなたのルートクエリーでそのuserIDを渡します。 – Duduche

+2

リセット機能がない場合(Relayには現在のところありません)、Relay自体でこれを行うのは良い考えではありません。 Relayは内部的にGraphQLデータをキャッシュするため、そのデータはユーザー固有のものである可能性がありますので、ログアウト時にそのキャッシュを無効にする必要があります。現時点では、これらのイベントのいずれかが発生したときに、ページの最新表示を行うことをおすすめしています。 – wincent

関連する問題