Social Login
18573 ワード
Social Login💻
1.ソーシャル・ログインを行う主体:client/resourceowner/resourceserver
Client:一般ユーザーではなくソーシャルログインを使用するユーザー
=サービスを作成する「マイ」
resourceowner:ソーシャルログイン機能を提供するサービスを使用するユーザー
=お客様が受信したい情報の所有者
resource server:ソーシャルログイン機能を提供する場所
=clientが必要な実際のユーザーデータを持つ場所
2.ソーシャルログインFlow
1)ユーザがソーシャルログインボタンをクリックすると,ログインしたいソーシャルサイト(ココアまたはGoogle)のログインページに移動する.
2)この場合、サービスプロバイダがログインページにアクセスするために、サービスプロバイダとソーシャル・ネットワーク・サービスとの間でこのインタラクションが発生するため、サービスプロバイダは、
OAuth
という名前のサービスを事前に利用する.3)ログインに成功した後、SNSはユーザーのページを以前使用したサービスページにリダイレクトする
중개자의 역할을 가능하도록 해주는 서비스 **OAuth **
=>ユーザーがソーシャルサイトにログインするとき、Authを通じて、ソーシャルサイトは「私」にAccess Tokenを提供し、「私」はこのトークンを通じてソーシャルサイトにアクセスし、ユーザーにログインページを提供します!!3.ソーシャル・ログインの実施方法
1)登録
クライアント Resource Server 使用します. 登録が必要です!=
Google Developer、Naver Developerなどのサイト
登録完了後、 Client わあ. Resource Server 全部で3種類ある
(
절대 코드에 노출되어지면 안되는 정보!!! = env 파일로 따로 관리해야함!
) 2)認証
ログインする resource owner すなわち,データの所有者サービスユーザの承認が必要である.
ボタンを押すと、 リソース所有者 リソースサーバにログインしようとするウィンドウに移動
ログインした場合: ソーシャルサービス(リソースサーバ)がログインしようとしているリンクのクライアントIDをチェック
ログインしていない場合:ログインを続行
- ソーシャルサービス(リソースサーバ)に対応するURLがない場合は、終了します.
→許可された場合、その応答 クライアントに送信します.
転送されたコンテンツ要求データの使用
サービスプロバイダ「マイ」がソーシャルサービスに接続されているときのアドレスリンクで、Authorizaion codeがclientID、clientsecret、redirect URLと一致していることを確認します.
一致すれば、ついに
Access Token
を配布します// goole-oauth
import { Injectable } from '@nestjs/common';
import { PassportStrategy } from '@nestjs/passport';
import { Strategy } from 'passport-google-oauth20';
@Injectable()
export class JwtGoogleStrategy extends PassportStrategy(Strategy, 'google') {
constructor() {
// 1. 검증부
super({
clientID: process.env.GOOGLE_CLIENT_ID,
clientSecret: process.env.GOOGLE_CLIENT_SECRET,
callbackURL: process.env.GOOGLE_CALLBACKURL,
scope: ['email', 'profile'],
});
}
// 2. 검증이 완료되면 실행
validate(accessToken: string, resfreshToken: string, profile: any) {
console.log(accessToken);
console.log(resfreshToken);
console.log(profile);
return {
// return 값은 context안의 request안 user로 들어감
email: profile.emails[0].value,
password: '1111',
name: profile.displayName,
phone: '01022222222',
address: '주소없음',
};
}
}
// naver-oauth
import { Injectable } from '@nestjs/common';
import { PassportStrategy } from '@nestjs/passport';
import { Strategy } from 'passport-naver-v2';
@Injectable()
export class JwtNaverStrategy extends PassportStrategy(Strategy, 'naver') {
constructor() {
// 1. 검증부
super({
clientID: process.env.NAVER_CLIENT_ID,
clientSecret: process.env.NAVER_CLIENT_SECRET,
callbackURL: process.env.NAVER_CALLBACKURL,
});
}
// 2. 검증이 완료되면 실행
validate(accessToken: string, resfreshToken: string, profile: any) {
console.log(accessToken);
console.log(resfreshToken);
console.log(profile);
return {
// return 값은 context안의 request안 user로 들어감
email: profile.email,
password: '1111',
name: profile.name,
phone: profile.mobile,
address: '주소없음',
};
}
}
//kakao-oauth
import { Injectable } from '@nestjs/common';
import { PassportStrategy } from '@nestjs/passport';
import { Strategy } from 'passport-kakao';
@Injectable()
export class JwtKakaoStrategy extends PassportStrategy(Strategy, 'kakao') {
constructor() {
// 1. 검증부
super({
clientID: process.env.KAKAO_CLIENT_ID,
clientSecret: process.env.KAKAO_CLIENT_SECRET,
callbackURL: process.env.KAKAO_CALLBACKURL,
scope: ['account_email', 'profile_nickname'],
});
}
// 2. 검증이 완료되면 실행
validate(accessToken: string, resfreshToken: string, profile: any) {
console.log(accessToken);
console.log(resfreshToken);
console.log(profile);
return {
// return 값은 context안의 request안 user로 들어감
email: profile._json.kakao_account.email,
password: '1111',
name: profile.username,
phone: '01022222222',
address: '주소없음',
};
}
}
=>各SNSの全体的な使い方は似ていますが、profileの内容が伝わる形が違うので、確認して正しく使う必要があります!勉強して書いているブログ.
間違った内容があるかもしれませんが、もしあれば、メッセージを残してください.ありがとうございます.
😊
Reference
この問題について(Social Login), 我々は、より多くの情報をここで見つけました https://velog.io/@yjin/Social-Loginテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol