[JWT]Refresh Tokenクライアント情報の保存
15533 ワード
今日は、JWTを保存し、クライアント情報に基づいてデータベースに保存してみましょう.
🔍目次なぜ が実施されたのかクライアント情報 を取得する.クライアント情報に従ってResfreshトークン を保存する.テスト 📌なぜ実施しますか?
実施の理由は、Restful APIを実施する際に、クライアントのRefresh Tokenを区別しなければならないからである.ユーザーは、Web、モバイル、その他のデバイスなどでサービスに接続できるため、ユーザーの1つのアカウントに応じて複数のトークンを発行する必要があります.以前に実装された内容は,各アカウントに1つのRefresh Tokenしか発行されなかった.
私が望んでいる.などのエージェントが必要な場合は、Refreshコインを繰り返し発行することはできません. エージェントのリフレッシュトークンはDBに格納されるべきである. 📌クライアント情報の取得
ブランチの作成
まず、この機能を実現するためにブランチを作成します.
まずRequestに送信するクライアント情報を調べてみましょう.
テストコントローラの作成
そして色々な価格で申し込みましょう. PostMan要求 Mac-Chromeリクエスト 移動要求 これはpcのローカル操作なので、私も知りません.ははは
これで、別のRefresh Tokenがユーザーエージェントによって保存されます.
📌クライアント情報に基づいてRefresh Tokenを保存
そのためにやるべきことがある.
1.「User-Agent」の値を取得する
2.「User-Agent」の値を区切る
3.区切り文字列をデータベースに保存する
「User-Agent」値の取得
面接を受けましたが、正式にコードに適用しましょう.
前の記事に示すように、「/login」urlにトークンが発行されます.それを直してください.
UserController.Javaコードの変更
「User-Agent」をいただきました.
「userService」でrefresh tokenを検証し、サービスに値を渡します.
「User-Agnet」値の区別
この内容は、データベースにプロキシ値が格納されているかどうかを確認します.
RefreshTokenRepository.java
タグ内のエージェントの情報を検証するためにjpaメソッドを作成する必要があります.
トークンドメインも変更する必要があります.トークンドメインにはプロキシ値が必要です.
次に、実装された内容に基づいてサービスでチェックしてみましょう.
保存されていない場合は、すぐに保存します.
📌テスト
Postmanでテストしてみます. agent - postman agnet - chrome
両方のリクエストは正しい応答を得た.データベースには、プロキシベースのRefresh Tokenを2つ保存する必要があります.
成功!
sequence idが2.4の理由は、同じリクエストが複数回クリックされたためです.
今はネクタイにリボンを置くことができます.
🔍目次
実施の理由は、Restful APIを実施する際に、クライアントのRefresh Tokenを区別しなければならないからである.ユーザーは、Web、モバイル、その他のデバイスなどでサービスに接続できるため、ユーザーの1つのアカウントに応じて複数のトークンを発行する必要があります.以前に実装された内容は,各アカウントに1つのRefresh Tokenしか発行されなかった.
私が望んでいる.
ブランチの作成
まず、この機能を実現するためにブランチを作成します.
git flow feature start JwtClient
git checkout JwtClient
リクエスト分析まずRequestに送信するクライアント情報を調べてみましょう.
テストコントローラの作成
@GetMapping("/jwtTest")
public String jwtTest(@RequestHeader("User-Agent") String userAgent){
log.info("UserAgent = {}", userAgent);
return userAgent;
}
まずGetにマッピングし、Header値の「User-Agent」値を取得します.そして色々な価格で申し込みましょう.
これで、別のRefresh Tokenがユーザーエージェントによって保存されます.
📌クライアント情報に基づいてRefresh Tokenを保存
そのためにやるべきことがある.
1.「User-Agent」の値を取得する
2.「User-Agent」の値を区切る
3.区切り文字列をデータベースに保存する
「User-Agent」値の取得
面接を受けましたが、正式にコードに適用しましょう.
前の記事に示すように、「/login」urlにトークンが発行されます.それを直してください.
UserController.Javaコードの変更
// 로그인
@PostMapping("/login")
public Token login(@RequestBody Map<String, String> user, @RequestHeader("User-Agent") String userAgent) {
log.info("user email = {}", user.get("userEmail"));
User member = userRepository.findByUserEmail(user.get("userEmail"))
.orElseThrow(() -> new IllegalArgumentException("가입되지 않은 E-MAIL 입니다."));
// return jwtService.login(member);
Token tokenDto = jwtTokenProvider.createAccessToken(member.getUsername(), member.getRoles());
// 여기서 user agent를 넘겨주어야함
jwtService.login(tokenDto, userAgent);
return tokenDto;
}
「User-Agent」をいただきました.
「userService」でrefresh tokenを検証し、サービスに値を渡します.
この内容は、データベースにプロキシ値が格納されているかどうかを確認します.
RefreshTokenRepository.java
タグ内のエージェントの情報を検証するためにjpaメソッドを作成する必要があります.
public interface RefreshTokenRepository extends JpaRepository<RefreshToken, Long> {
Optional<RefreshToken> findByRefreshToken(String refreshToken);
//생성
boolean existsByKeyEmailAndUserAgent(String userEmail, String userAgent);
//생성
void deleteByKeyEmailAndUserAgent(String userEmail, String userAgent);
}
RefreshToken.javaトークンドメインも変更する必要があります.トークンドメインにはプロキシ値が必要です.
public class RefreshToken {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "REFRESH_TOKEN_ID", nullable = false)
private Long refreshTokenId;
@Column(name = "REFRESH_TOKEN", nullable = false)
private String refreshToken;
@Column(name = "KEY_EMAIL", nullable = false)
private String keyEmail;
@Column(name ="USER_AGENT", nullable = false)
private String userAgent;
}
UserService.java次に、実装された内容に基づいてサービスでチェックしてみましょう.
@Transactional
public void login(Token tokenDto, String userAgent){
RefreshToken refreshToken = RefreshToken.builder().keyEmail(tokenDto.getKey()).refreshToken(tokenDto.getRefreshToken()).build();
String loginUserEmail = refreshToken.getKeyEmail();
//여기서 refresh Token과 해당 agent로 저장되어있는지 확인을 해야한다.
if(refreshTokenRepository.existsByKeyEmailAndUserAgent(loginUserEmail, userAgent)){
log.info("기존의 존재하는 refresh 토큰 삭제");
refreshTokenRepository.deleteByKeyEmailAndUserAgent(loginUserEmail, userAgent);
}
refreshTokenRepository.save(refreshToken);
}
保存されている場合は、削除して再保存します.保存されていない場合は、すぐに保存します.
📌テスト
Postmanでテストしてみます.
両方のリクエストは正しい応答を得た.データベースには、プロキシベースのRefresh Tokenを2つ保存する必要があります.
成功!
sequence idが2.4の理由は、同じリクエストが複数回クリックされたためです.
今はネクタイにリボンを置くことができます.
Reference
この問題について([JWT]Refresh Tokenクライアント情報の保存), 我々は、より多くの情報をここで見つけました https://velog.io/@jkijki12/JWT-Refresh-Token-클라이언트정보-저장하기テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol