web-dev-qa-db-ja.com

React JS-fetchステートメントで認証情報を認証する方法

私の目標は、json Restサービスから実行されるReact JSログインページを作成することです。Postmanで、サービスのURLを入力すると、POSTとし、次のJSONを本文に入力します:{username: "myUserName"、password: "myPassword"} ...トークンが返されるので、フェッチ句でJSON.stringifyを使用してサーバーへのユーザー名とパスワード。

私はFetchをreactで使用するのが初めてなので、私の質問は、react JSをfetchのみで使用して、さまざまなユーザーの認証を開始するにはどうすればよいですか?私は自分のロジックをFetch句の2番目の時間内に記述すると思いますか?

現在、私のページは資格情報を受け入れ、送信ボタンをクリックするとユーザーをランディングページにルーティングします。 fetchを含む関数があり、onSubmitボタンがクリックされるとfetch関数を呼び出します。これにより、トークンが取得されます。

これは私のコードです:

import React, { Component } from 'react';
import ReactDOM from 'react-dom';
import './Login.css';
import { withRouter } from 'react-router-dom';

class Login extends Component {

    constructor() {
        super();
        this.state = {
            data: [],
            username: "",
            password: "",
            token: "",
        };
    } //end constructor

    componentWillMount() {
    }

    componentDidMount() {
        this.fetchData();
    }

    fetchData() {
        fetch('http://theapi/api/auth', {
            method: 'POST',
            headers: {
                'Content-type': 'application/json',
            },
             body: JSON.stringify({
                username: 'myUserName',
                password: 'myPassword',
                Authorization: 'TheReturnedToken',
            })
        }) /*end fetch */
        .then(results => results.json())
        .then(data => this.setState({ data: data })

        )
    }

    //request the token
      requestAccessToken(data) {
        const loginInfo = '${data}&grant_type=password';
        return fetch('${API_URL}Token', {
          method: 'POST',
          headers: new Headers({
            'Content-Type': 'application/json',
          }),
          body: loginInfo,
        })
          .then((response) => response.json());
      }

      //authenticate request
      requestUserInfo(token) {
        return fetch('${API_URL}api/participant/userinfo', {
          method: 'GET',
          headers: new Headers({
            Authorization: 'Bearer ${token}',
          }),
        })
          .then((response) => response.json());
      }

    change = (e) => {
        this.setState({
            [e.target.name]: e.target.value
        });
    }; //end change

    onSubmit = (e) =>{
        this.fetchData();
        e.preventDefault();
        //console.log(this.state);
        this.setState({
             username: "",
             password: "",
            });

        this.props.history.Push('/landing');
        };

    render() {
    console.log(this.state.data);
        return (
           <div>
                <div className="loginContainer">
                <h2>Member Login</h2>
                    <form>
                            <input
                            id="username"
                            name="username"
                            placeholder="User Name"
                            value={this.state.username}
                            onChange={e => this.change(e) }
                            className="form-control"
                            />  <br />

                            <input
                            id="password"
                            name="password"
                            type="password"
                            placeholder="Password"
                            value={this.state.password}
                            onChange={e => this.change(e) }
                            className="form-control"
                            />  <br />

                        <button onClick={e => this.onSubmit(e)} className="btn btn-primary">Submit</button>
                        </form>
                    </div>
            </div>
        );
      }
}

export default withRouter(Login);

フォームでさまざまなユーザーを認証する方法を教えてください。基本的に、ユーザー名とパスワードを受け入れ、2つが一致する場合は、ユーザーのページをランディングページにルーティングすることを試みています。

6
user1724708

本文に認証トークンを入れないでください。ヘッダーに入れます。最初の関数は、ユーザー名、パスワード、および認証タイプを渡します(つまり、grant_type=password)。次に、2番目の関数がそれを使用して要求を認証します。私のAPIは、渡されたトークンに基づいて誰が要求しているかを知っているため、ユーザー情報を渡す必要はありません。現在の OAuth 2.0はこちら のドキュメントであり、詳細情報を見つけることができます。 fetchでのヘッダーの使用について Mozillaのfetchドキュメント

// request the token
// subscribe to this event and use the returned json to save your token to state or session storage
export function requestAccessToken(data) {
  const loginInfo = `${data}&grant_type=password`;
  return fetch(`${API_URL}Token`, {
    method: 'POST',
    headers: new Headers({
      'Content-Type': 'application/x-www-form-urlencoded',
    }),
    body: loginInfo,
  })
    .then((response) => response.json());

    // in your case set state to returned token
}

// use said token to authenticate request
export function requestUserInfo(token) {
  return fetch(`${API_URL}api/participant/userinfo`, {
    method: 'GET',
    headers: new Headers({
      Authorization: `Bearer ${token}`,
    }),
  })
    .then((response) => response.json());
}

私もお勧めします:

  1. サンクまたはサガからフェッチを呼び出すが、これは質問の範囲外です。

  2. トークンを隠しフィールドに置く必要はありません。どちらもまだアクセス可能です。そのままにしておいてください。それを少し安全にするためにあなたができることが他にもありますが、これも問題の範囲外です。

3
Jay Jordan