Проверка, если "admin" или "пользователь" используют fetch в реагировать - PullRequest
0 голосов
/ 26 октября 2019

Мне нужно проверить, когда пользователь longin (использует fetch API), если role == "admin" или "user", использует токен. если role == "admin", то, например, сделать перенаправление на / account, в противном случае, если это "пользователь", тогда скрыть форму аутентификации в render и сделать анимацию (css / js) на странице, если есть возможность скрыть другие вещи. когда это простой пользователь, а не администратор.

Это мой код. Вот результат хорошей аутентификации администратора, токен здесь "result":

{
    "success": true,
    "message": "SUCCESS",
    "result": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhY2NvdW50IjpbeyJkYXRlQ3JlYXRpb24iOiIyMDE5LTEwLTI0VDEwOjMyOjMwLjczMFoiLCJyZXNldHBhc3N3b3JkdG9rZW4iOm51bGwsInJlc2V0cGFzc3dvcmRleHBpcmVzIjpudWxsLCJyb2xlIjoiYWRtaW4iLCJlbmFibGUiOnRydWUsIl9pZCI6IjVkYjE3Zjg2M2ZhZjNmMTE1NDQ3OWVlNiIsImVtYWlsIjoic2FhcmFhYWFjaGVtbGFsQGdtYWlsLmNvbSIsInBhc3N3b3JkIjoiJDJiJDEwJGxGSUpKQVBXUmVaZ0MvTWpEaGJuSGVjUzdGb3d3QTlUU2pMTlRmVXdRWEpQdlgwTmhDTXd1IiwidGlja2V0cyI6W10sImdhaW5zIjpbXSwiX192IjowLCJub20iOiJBQ0hFTUxBTF8iLCJwcmVub20iOiJNRVJZRU1fIiwidGVsIjoiMDYxOTU2MjcyMSJ9XSwiaWF0IjoxNTcyMDQzOTUyfQ.ZuNdWcWfu-J_dvgCmUH_w8EAx4FIeSMvAqG8ebm1ilc"
}

Auth ofПростой пользователь такой же, есть только токен, который изменяется. У меня есть API выборки для входа в систему:

constructor (props) {
    super(props);
    this.state = {
      cnx_mail: '',
      cnx_pwd: '',
      items: [],
      token : '',
      errors: {},

      formErrors: {cnx_mail: '', cnx_pwd: ''},
      emailValid: false,
      passwordValid: false,
      formValid: false
    }
     this.handleUserInput = this.handleUserInput.bind(this);
     this.handleSubmit = this.handleSubmit.bind(this);
  }

handleSubmit = (event) => {
    event.preventDefault();
    fetch(`${API}/api/connexion`, {
        method: 'POST',
        headers: {
            'Content-Type': 'application/json',   
          },
        body: JSON.stringify ({
            email: this.state.cnx_mail,
            password: this.state.cnx_pwd,
          })
    })
    .then(res => res.json())
    .then(json => {
        console.log(json);
        localStorage.setItem('toktok', json.result);
        // Redirect here if Admin  this.props.history.push('/accounts');  Else hide the authentication form in render()      

    }); 
  }

Моя форма авторизации в render ()> скрывает ее, когда роль == пользователь:

<form className="demoForm" onSubmit={this.handleSubmit} noValidate  encType="application/x-www-form-urlencoded">
                                <div className="alreadysubscribed-input">
                                    <div className={`alreadysubscribed-field group-input ${this.errorClass(this.state.formErrors.cnx_mail)}`}>
                                        <input type="email" required className="form-control fatb-input input-form" name="cnx_mail"
                                            value={this.state.cnx_mail}
                                            id="cnx_mail"
                                            onChange={this.handleUserInput} error={errors.cnx_mail} />
                                            <label className="fatb-label" htmlFor="cnx_mail">Email</label>
                                            <div className="fatb-bar"></div>                                  
                                    </div>

                                    <div className={`alreadysubscribed-field group-input ${this.errorClass(this.state.formErrors.cnx_pwd)}`}>
                                        <input type="password" required className="form-control fatb-input input-form" name="cnx_pwd"
                                            value={this.state.cnx_pwd}
                                            id="cnx_pwd"
                                            onChange={this.handleUserInput} error={errors.cnx_pwd} />
                                            <label className="fatb-label" htmlFor="cnx_pwd">Mot de passe</label>
                                            <div className="fatb-bar"></div>
                                    </div>
                                </div>
                                <FormErrors formErrors={this.state.formErrors} />

                                <div className="btn-cnx">
                                    {/* <span className="mas">Se connecter</span> */}
                                    <button className="fatb-btn bubbly-button btn-anim3 w100p" type="submit"  name="cnx_btn" disabled={!this.state.formValid}>se connecter</button>
                                </div>
                            </form>

Ответы [ 2 ]

1 голос
/ 26 октября 2019

вот как вы проверяете role в токене

// fake the result:
var json = {
    result: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhY2NvdW50IjpbeyJkYXRlQ3JlYXRpb24iOiIyMDE5LTEwLTI0VDEwOjMyOjMwLjczMFoiLCJyZXNldHBhc3N3b3JkdG9rZW4iOm51bGwsInJlc2V0cGFzc3dvcmRleHBpcmVzIjpudWxsLCJyb2xlIjoiYWRtaW4iLCJlbmFibGUiOnRydWUsIl9pZCI6IjVkYjE3Zjg2M2ZhZjNmMTE1NDQ3OWVlNiIsImVtYWlsIjoic2FhcmFhYWFjaGVtbGFsQGdtYWlsLmNvbSIsInBhc3N3b3JkIjoiJDJiJDEwJGxGSUpKQVBXUmVaZ0MvTWpEaGJuSGVjUzdGb3d3QTlUU2pMTlRmVXdRWEpQdlgwTmhDTXd1IiwidGlja2V0cyI6W10sImdhaW5zIjpbXSwiX192IjowLCJub20iOiJBQ0hFTUxBTF8iLCJwcmVub20iOiJNRVJZRU1fIiwidGVsIjoiMDYxOTU2MjcyMSJ9XSwiaWF0IjoxNTcyMDQzOTUyfQ.ZuNdWcWfu-J_dvgCmUH_w8EAx4FIeSMvAqG8ebm1ilc"
};

// this one line is your answer
const isAdmin = JSON.parse(atob(json.result.split('.')[1])).account[0].role === 'admin';

// 
console.log(isAdmin);

Предупреждение

полезная нагрузка токена выглядит следующим образом

{
  "account": [
    {
      "dateCreation": "2019-10-24T10:32:30.730Z",
      "resetpasswordtoken": null,
      "resetpasswordexpires": null,
      "role": "admin",
      "enable": true,
      "_id": "5db17f863faf3f1154479ee6",
      "email": "saaraaaachemlal@gmail.com",
      "password": "$2b$10$lFIJJAPWReZgC/MjDhbnHecS7FowwA9TSjLNTfUwQXJPvX0NhCMwu",
      "tickets": [],
      "gains": [],
      "__v": 0,
      "nom": "ACHEMLAL_",
      "prenom": "MERYEM_",
      "tel": "0619562721"
    }
  ],
  "iat": 1572043952
}

МНОГО личной информациив этом!!! то есть одно поле личной информации было бы слишком много

1 голос
/ 26 октября 2019

Похоже, ваш токен имеет формат JWT или "JSON Web Token".

Прежде всего, предостережение: очень опасно выставлять JWT через такой API. Гораздо предпочтительнее поддерживать передачу JWT с помощью безопасных файлов cookie только для HTTP. Если плохой игрок получает этот токен JWT, он может выполнять задачи от имени пользователя.

При этом, если вы настаиваете на том, чтобы выставлять маркер пользователя в браузере, знайте, что JWT могут быть декодированы для показа ихполезная нагрузка. JWT, который вы разместили здесь, имеет такую ​​полезную нагрузку:

{
  "account": [
    {
      "dateCreation": "2019-10-24T10:32:30.730Z",
      "resetpasswordtoken": null,
      "resetpasswordexpires": null,
      "role": "admin",
      "enable": true,
      "_id": "5db17f863faf3f1154479ee6",
      "email": "saaraaaachemlal@gmail.com",
      "password": "$2b$10$lFIJJAPWReZgC/MjDhbnHecS7FowwA9TSjLNTfUwQXJPvX0NhCMwu",
      "tickets": [],
      "gains": [],
      "__v": 0,
      "nom": "ACHEMLAL_",
      "prenom": "MERYEM_",
      "tel": "0619562721"
    }
  ],
  "iat": 1572043952
}

Вы можете прочитать свойство account.role, чтобы решить, что делать в вашем приложении. См. Спецификацию JWT для получения более подробной информации о том, как анализировать JWT, или может быть библиотека, доступная для вас.

Опять же, я бы предостерег вас, чтобы вы никогда не возвращалиJWT в API. Вы всегда можете просто выставить его без битов подписи, чтобы сделать его непригодным для использования в качестве токена аутентификации (разбить его на символы . и вернуть сегмент полезной нагрузки);тогда на стороне клиента вам нужно только base64-декодировать строку. Или, возможно, ваш API может сделать это для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...