Naver,Kakao登録粉砕機🔥
完全なOAuthログイン方法
💻 Naverログインクライアント(レスポンス)コード
NAVERを使用してJDKにログインする方法
ログインページコンポーネント
import LoginNaver from './LoginNaver';
<LoginNaver />
NAVERログインJDK使用ロジックimport React, { useEffect } from 'react';
import { naverClientId, naverRedirectURL, naverSecret } from '../../utils/OAuth';
const { naver } = window;
const LoginNaver = () => {
const initializeNaverLogin = () => {
const naverLogin = new naver.LoginWithNaverId({
clientId: naverClientId,
callbackUrl: naverRedirectURL,
clientSecret: naverSecret,
isPopup: false, // popup 형식으로 띄울것인지 설정
loginButton: { color: 'green', type: 3, height: '60' }, //버튼의 스타일, 타입, 크기를 지정
});
naverLogin.init();
};
useEffect(() => {
initializeNaverLogin();
}, []);
return <div id='naverIdLogin' />;
};
export default LoginNaver;
戻り値http//리다이렉트 설정 url ? access-token = {토큰값} & state = {스테이트 값} & token-type = {토근타입} & expire = {만료기간}
NAVERを使用してREST APIにログインする方法
aラベルに
https://nid.naver.com/oauth2.0/authorize?response_type=code&client_id={클라이언트아이디}&state={임의값 사용}&redirect_uri={등록한 리다이렉트 URL}
を入れてNAVER登録ページに入ります.その後、ログインが完了すると、設定したリダイレクトアドレスがURLにcode値とstate値を渡します.📢 ここは重要なポイント!!
NAVER JDKを使用してクライアントにログインしている場合は、リモート・ログインに移行するトークンは使い捨てトークンではなく、すぐに使用できるアクセストークンです.
したがって、サーバは、ユーザプロファイル情報を直ちに要求することができる.
(これを知らなかったので、トークン配布トークンapiで起動したので大変でした…)
逆に、クライアントがREST APIを使用して要求する場合は、使い捨てトークンであるため、サーバは、そのトークンを再び使い捨てトークンとして発行し、プロファイル情報を使用してAPIを要求する必要がある.
NAVERログインJDKサーバ処理ロジック(Spring)
public void naverToken(String code, HttpServletResponse response) throws IOException {
try {
JSONParser jsonParser = new JSONParser();
String header = "Bearer " + code;
Map<String, String> requestHeaders = new HashMap<>();
requestHeaders.put("Authorization", header);
String responseBody = get(NAVER_USER_INFO_URI, requestHeaders);
JSONObject parse = (JSONObject) jsonParser.parse(responseBody);
JSONObject responseParse = (JSONObject) parse.get("response");
String encodeUserName = (String) responseParse.get("name");
String loginId = (String) responseParse.get("id");
String email = (String) responseParse.get("email");
String phoneNumber = (String) responseParse.get("mobile_e164");
String userName = new String(encodeUserName.getBytes(StandardCharsets.UTF_8));
User user = new UserRequest("social_" + loginId, userName, encode.encode("네이버"), email, phoneNumber).naverOAuthToEntity();
if (userRepository.existsByLoginId(user.getLoginId()) == false) {
userRepository.save(user);
}
String access_token = tokenProvider.create(new PrincipalDetails(user));
response.addHeader("Authorization", "Bearer " + access_token);
} catch (Exception e) {
e.printStackTrace();
}
}
💻 Kakaoログインクライアント(レスポンス)コード
我々はREST APIのみを用いてKACOを実装し,その位置付けのみを行う.
KACAREST APIクライアント使用ロジック
// 변수처리를 위한 다른 JS 파일
export const KAKAO_AUTH_URL = `https://kauth.kakao.com/oauth/authorize?client_id=${kakaoClientId}&redirect_uri=${kakaoRedirectURL}&response_type=code&prompt=login`;
// 로그인 페이지 해당 코드
<KakaoBtn href={KAKAO_AUTH_URL}>
<img src={`${process.env.PUBLIC_URL}/images/kakao_login_large_narrow.png`} alt='kakaoLogin' />
</KakaoBtn>
戻り値http//리다이렉트 설정 url?code={일회성 토큰값}
ログイン要求時にurlに他のstate値を入れなかった場合、state値はオプションでスキップされません.ファイルを見て混同しないでください.📢 ここは重要なポイント!!
このセクションではREST APIが使用されるため、使い捨てトークンはクライアントに移行します.したがって、トークンはサーバ上で正式なトークンを再度発行し、受信したaccess-tokenを使用してユーザープロファイルクエリーAPIを起動する必要があります.これにより、エラーは発生しません.
また、contentTypeが正しいことを確認してください!
私の場合、
ContentType -> application/json
に勝手にjsonリクエストを送信しました.org.springframework.web.client.HttpClientErrorException$Unauthorized: 401 Unauthorized: [no body]
上記のエラーが発生しましたので、ぜひ!!ContentTypeは
application/x-www-form-urlencoded;charset=utf-8
公式文書に従って申請してください!KACAログインJDKサーバ処理ロジック(Spring)
public void kakaoToken(String code, HttpServletResponse res, HttpSession session) {
RestTemplate rt = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.add("Content-type", "application/x-www-form-urlencoded;charset=utf-8");
MultiValueMap<String, String> accessTokenParams = accessTokenParams("authorization_code",KAKAO_CLIENT_ID ,code,KAKAO_REDIRECT_URI);
HttpEntity<MultiValueMap<String, String>> accessTokenRequest = new HttpEntity<>(accessTokenParams, headers);
ResponseEntity<String> accessTokenResponse = rt.exchange(
KAKAO_TOKEN_URI,
HttpMethod.POST,
accessTokenRequest,
String.class);
try {
JSONParser jsonParser = new JSONParser();
JSONObject jsonObject = (JSONObject) jsonParser.parse(accessTokenResponse.getBody());
session.setAttribute("Authorization", jsonObject.get("access_token"));
String header = "Bearer " + jsonObject.get("access_token");
System.out.println("header = " + header);
Map<String, String> requestHeaders = new HashMap<>();
requestHeaders.put("Authorization", header);
String responseBody = get(KAKAO_USER_INFO_URI, requestHeaders);
JSONObject profile = (JSONObject) jsonParser.parse(responseBody);
JSONObject properties = (JSONObject) profile.get("properties");
JSONObject kakao_account = (JSONObject) profile.get("kakao_account");
Long loginId = (Long) profile.get("id");
String email = (String) kakao_account.get("email");
String userName = (String) properties.get("nickname");
User kakaoUser = new UserRequest("social_" + loginId, encode.encode("카카오"), userName, email).kakaoOAuthToEntity();
if (userRepository.existsByLoginId(kakaoUser.getLoginId()) == false) {
userRepository.save(kakaoUser);
}
String access_token = tokenProvider.create(new PrincipalDetails(kakaoUser));
res.setHeader("Authorization", "Bearer "+access_token);
} catch (Exception e) {
e.printStackTrace();
}
}
再三注意する
🔗 リファレンス
OAuthロジック写真を参照してください
Reference
この問題について(Naver,Kakao登録粉砕機🔥), 我々は、より多くの情報をここで見つけました https://velog.io/@padd60/네이버-카카오-로그인-뿌수기テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol