반응형
golang에서 jwt 토큰 만들어 보자
# 생성 방법
1) 토큰에 넣을 정보를 구조체로 만들어보자
type UserClaim struct {
Id string `json:"id"`
Name string `json:"name"`
Roles string `json:"roles"`
}
2) 토큰을 넣을 구조체를 만들었다
=> string으로 받아도 된다. 나는 나중에 RefreshToken도 만들 예정이어서 구조체로 만들었다.
type JwtToken struct {
AccessToken string
}
3) json값을 map으로 전환해주는 함수
func (c UserClaim) ConvertMap() (map[string]interface{}, error) {
bytes, err := json.Marshal(c)
if err != nil {
return nil, err
}
var resultMap map[string]interface{}
if err := json.Unmarshal(bytes, &resultMap); err != nil {
return nil, err
}
return resultMap, nil
}
4) jwt 생성하는 함수를 만든다.
func (JwtAuthentication) GenerateJwtToken(claim UserClaim) (JwtToken, error)
JwtSecret= "test" //JWT에서 서명에 안전을 위해 적절하게 설정한다
//json값을 map으로 전환 해준다 ex) map[id:11@genie.com name:유지니 roles:MEMBER]
claimMap, err := claim.ConvertMap()
if err != nil {
return JwtToken{}, err
}
accessTokenClaims := jwt.MapClaims{} //JSON 디코딩에 map[string] 인터페이스 {} 사용
for key, value := range claimMap {
accessTokenClaims[key] = value
}
//토큰 만료시간 만들어서 accessTokenClaims에 넣어준다
accessTokenClaims["exp"] = time.Now().Add(time.Minute * 15).Unix() //만료시간 15분으로 설정
//토큰 만들기
accessToken, err := jwt.NewWithClaims(jwt.SigningMethodHS256, accessTokenClaims).SignedString([]byte(JwtSecret))
if err != nil {
return JwtToken{}, err
}
return JwtToken{
AccessToken: accessToken,
}, nil
}
claim
에는 정보가 들어있다 ex) {11@genie.com 유지니 MEMBER}accessTokenClaims
에 내 정보를 넣어 준다.accessTokenClaims
에 만료시간을 만들어서 넣어준다. 제한시간 15분이다- JwtSecret 값을 나는 현재 바로 위에 그냥 적었지만 환경변수에서 설정을 해준다.
- 토큰을 생성하고 그걸
JwtToken
구조체에 있는AccessToken
에 넣어서 반환하면 된다.
# response 값
{
"accessToken": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2NTcyODg1NjcsImlkIjoiMTFAZ2VuaWUuY29tIiwibmFtZSI6IuycoOyngOuLiCIsInJvbGVzIjoiTUVNQkVSIn0.qARDq11ri37TF9ci8KGNiuV68_NGxSDeoDvcKdM4Pxo"
}
# JWT 해석하기
# 토큰 해석 할 수 있는 사이트
# 참조
https://github.com/dgrijalva/jwt-go
반응형
'Study > Go 언어' 카테고리의 다른 글
[Golang] XORM에서 this is incompatible with DISTINCT 에러 메시지 발생 (0) | 2022.09.23 |
---|---|
[error] sql: expected 2 destination arguments in Scan, not 1 에러메시지 해결책 (0) | 2022.08.04 |
[golang] validator 패키지 사용방법 (0) | 2022.06.13 |
[golang] go에서 DB연결하는 방법 (0) | 2022.05.10 |
[golang] 배열을 string으로 변경하는 방법 (0) | 2022.05.09 |