kachuno9
@kachuno9

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Reactでのトークンの取得方法を教えてください!

解決したいこと

バックエンドにDjango REST Framework、フロントエンドにReactを用いてWebアプリケーションを作成しています。DRFはAPIとして使用しています。

現在困っていることは、JWTを用いた会員登録機能の実装で、React側での認証の仕方やトークンの取得方法が分かりません。

<できていること>
・カスタムユーザーモデルの作成(email,passwordで認証)
・DRF側でsimple-jwtを用いて、アクセストークン及びリフレッシュトークンの表示
(エンドポイント: http://localhost:8000/api/v1/auth/jwt/create)
(ターミナルやModHeaderなどを使えばDRF側のみでは認証がうまくいく)

<解決したいこと>
・React側でAPIエンドポイントからのデータの取得・処理を行うために以下の手順を考えているのですが、まずはAPI側に表示しているトークンをReact側で取得したいです。

(想定している処理の流れ)
①email、passwordを http://localhost:8000/api/v1/auth/jwt/create に送信し、トークンを取得
②取得したトークンをヘッダーにセットしてAPIに接続

<開発環境>
MacOS BigSur -- 11.2.1

発生している問題・エラー

スクリーンショット 2021-04-05 23.24.30.png
Get JWTボタンを押すとJWTを表示させる処理を書いたのですが、画像のように、Get JWTボタンを押すと以下の様なエラーが発生してしまいます。

GET http://localhost:8000/api/v1/auth/jwt/create 405 (Method Not Allowed)
createError.js:16 Uncaught (in promise) Error: Request failed with status code 405
    at createError (createError.js:16)
    at settle (settle.js:17)
    at XMLHttpRequest.handleLoad (xhr.js:62)

該当するソースコード

(React)Login.js
import React, { useState, useEffect, useRef } from 'react';
import { useCookies } from 'react-cookie';
import axios from 'axios';
import { useForm } from "react-hook-form";
import  { useHistory } from 'react-router-dom';
import { apiURL } from './Default';

const Login = (props) => {
      const storedJwt = localStorage.getItem('token');
      const [jwt, setJwt] = useState(storedJwt || null);

      const getJwt = async () => {
        const { data } = await axios.get(`${apiURL}auth/jwt/create`);
        localStorage.setItem('token', data.token);
        setJwt(data.token);
        console.log("GET JWT")
      };

    return (
        <div>
          <p>ログインページ</p>
          <button onClick={() => getJwt()}>Get JWT</button>
          {jwt && (
            <pre>
             <code>{jwt}</code>
            </pre>
          )}
        </div>
    );
  }
  export default Login;

自分で試したこと

API側でトークンを表示させ、とりあえずReact側でそのトークンの取得を試してみよう、と思ったのですが405エラーが出てしまい原因が分かりません。

どなたか改善策を教えていただけないでしょうか?
よろしくお願いいたします。

0

1Answer

GET http://localhost:8000/api/v1/auth/jwt/create 405 (Method Not Allowed)

エラーメッセージの Method Not Allowed は許可されていないメソッド、今回の場合には GET が使われている、という意味ですよね。

例えば POST メソッドを使ってみたらどうなるでしょう?

2Like

Comments

  1. @kachuno9

    Questioner

    ご回答ありがとうございます!!!
    早速、getの部分をpostに書き換えたのですが、400 (Bad Request)が出てしまいました。。

    このエラーを調べ、一般的なクライアントエラーという情報を目にしたので以下のようにいくつか解決策を試してみました。
    ・URLの確認
    ・ブラウザの拡張機能を無効にする

    が、エラーが出たままです。。
  2. Method Not Allowed が出なくなったということはメソッド POST は受け付けられているのだと思います。

    Bad Request が起きているということは、リクエストのやりかたがおかしいということです。
    掲示のソースコードだと GET メソッドで、かつリクエスト情報がありませんでしたが、本来はユーザ名とパスワードを渡す必要があると思います。

    POST にしてリクエストはどのように渡していますか?
    もし渡していないようであれば、以下のような形式で渡してみてください(設定などで username 以外に変更していなければ)。

    { username: "ユーザ名", password: "パスワード" }

    ちなみに、リクエストも以下の形で返ってくるのではないかと思います。

    { access: "アクセストークン", refresh: "リフレッシュトークン" }
  3. @kachuno9

    Questioner

    なるほどです!!
    HTTP通信に関する知識不足でした。

    post(URL, {email:"sample@gmail.com",password:"sample"});
    に変更すると、教えていただいたようにアクセストークンとリフレッシュトークンが取得できました!!!
    わかりやすく親切に教えていただいて、助かりました!!
    トークンの取得方法が分かったので、認証に向けて自分でもう少し勉強してみます。
    本当にありがとうございます!!^^

Your answer might help someone💌