OAuth2.0은 인증을 위한 표준 프로토콜의 한 종류
this.GITHUB_LOGIN_URL = `https://github.com/login/oauth/authorize?client_id=7d13eccd83ee6d5c12b4`
// 사용자의 github id 요청
}
socialLoginHandler() {
window.location.assign(this.GITHUB_LOGIN_URL)
}
등록하면 client id, secret을 받아온다. (이 때, client id는 공유되어도 상관없지만 secret은 노출되어선 안되고 server에서만 관리한다. 이후 클라이언트에서 authorization code를 받아오면 서버는 갖고 있던 id, secret과 함께 authorization server에 요청하여 authorization token을 받아올 수 있다.)
client에서는 client 아이디를 이용해 사용자 인증(화면에 인증 요구 화면 띄워주기)을 하고 user가 인증 허용을 하면 authorization code와 함께 client url로 리다이렉션된다.
componentDidMount() {
const url = new URL(window.location.href)
const authorizationCode = url.searchParams.get('code')
if (authorizationCode) {
// authorization server로부터 클라이언트로 리디렉션된 경우, authorization code가 함께 전달됩니다.
// ex) http://localhost:3000/?code=5e52fb85d6a1ed46a51f
this.getAccessToken(authorizationCode)
}
}
async getAccessToken(authorizationCode) {
// 받아온 authorization code로 다시 OAuth App에 요청해서 access token을 받을 수 있다.
// access token은 보안 유지가 필요하기 때문에 클라이언트에서 직접 OAuth App에 요청을 하는 방법은 보안에 취약할 수 있다.
// authorization code를 서버로 보내주고 서버에서 access token 요청을 하는 것이 적절
// TODO: 서버의 /callback 엔드포인트로 authorization code를 보내주고 access token을 받아온다.
// access token을 받아온 후
// - 로그인 상태를 true로 변경하고,
// - state에 access token을 저장
const data = await axios.post('http://localhost:8080/callback',
{
authorizationCode: authorizationCode
}
)
.then((res) => {
return res.data
})
console.log(data.accessToken)
this.setState({
isLogin : true,
accessToken : data.accessToken
})
}
module.exports = async (req, res) => {
//이제 authorization code를 이용해 access token을 발급받기 위한 post 요청을 보낸다.
const data = await axios.post('https://github.com/login/oauth/access_token', {
client_id: clientID,
client_secret: clientSecret,
code: req.body.authorizationCode
})
.then(res => res.data)
.catch(err => console.log(err))
console.log(data)
res.status(200).send({ accessToken: data.access_token })
}
async getGitHubUserInfo() {
const userInfo = await axios.get('https://api.github.com/user', {
headers: { authorization: `token ${this.props.accessToken}`, withCredential: true}
})
this.setState({
userInfo: userInfo.data
})
}
authorization code grant type
과 refresh token grant type
만 알고 가자.