Programing

사람들은 Go에서 인증을 어떻게 관리하고 있습니까?

crosscheck 2020. 5. 19. 21:33
반응형

사람들은 Go에서 인증을 어떻게 관리하고 있습니까?


Go에서 RESTful API 및 JS 프론트 엔드 앱을 구축하는 경우 인증을 어떻게 관리하고 있습니까? 특정 라이브러리 나 기술을 사용하고 있습니까?

나는 이것에 대해 너무 작은 토론을 발견 한 것에 놀랐습니다. 나는 다음과 같은 대답을 명심하고 내 구현을 개발하지 않도록 노력하고 있습니다.

ASP.Net의 인증 양식

모두 각자의 솔루션을 별도로 코딩하고 있습니까?


이 질문은 많은 견해를 얻었고 인기있는 질문 배지가 있으므로이 주제에 많은 관심을 가지고 있으며 많은 사람들이 정확히 똑같은 것을 묻고 인터 웹에서 답을 찾지 못합니다.

이용 가능한 대부분의 정보는 텍스트를 손으로 흔드는 것과 동일하며 "독자 운동"으로 남습니다. ;)

그러나 마지막으로 golang-nuts 메일 링리스트의 회원이 제공 한 구체적인 예를 하나 찾아 냈습니다.

https://groups.google.com/forum/#!msg/golang-nuts/GE7a_5C5kbA/fdSnH41pOPYJ

이는 사용자 정의 인증의 기초로 제안 된 스키마 및 서버 측 구현을 제공합니다. 클라이언트 측 코드는 여전히 귀하의 몫입니다.

(기사의 저자가 이것을 보길 바랍니다 : 감사합니다!)

발췌 (및 재 포맷) :


"저는 다음과 같은 디자인을 제안합니다.

create table User (
 ID int primary key identity(1,1),
 Username text,
 FullName text,
 PasswordHash text,
 PasswordSalt text,
 IsDisabled bool
)

create table UserSession (
 SessionKey text primary key,
 UserID int not null, -- Could have a hard "references User"
 LoginTime <time type> not null,
 LastSeenTime <time type> not null
)
  • 사용자가 TLS에서 POST를 통해 사이트에 로그인 할 때 암호가 유효한지 확인하십시오.
  • 그런 다음 임의의 세션 키 (예 : 50 개 이상의 암호화 랜드 문자 및 물건)를 안전한 쿠키에 발행하십시오.
  • 해당 세션 키를 UserSession 테이블에 추가하십시오.
  • 그런 다음 해당 사용자를 다시 볼 때 먼저 UserSession 테이블을 눌러 SessionKey가 유효한 LoginTime과 함께 있고 LastSeenTime과 User가 삭제되지 않았는지 확인하십시오. UserSession에서 타이머가 자동으로 오래된 행을 지우도록 디자인 할 수 있습니다. "

또 다른 가능한 해결책은 최근 메일 링 리스트 에 발표 된 Authboss 입니다.

(이 라이브러리를 사용해 보지 않았습니다.)

또한 사용자 인증으로 웹앱을 만드는 가장 좋은 방법을 참조하십시오 .


미들웨어를 사용하여 인증을 수행합니다.

기본 및 요약 인증을 위해 go-http-auth시도 하고 OAuth2를 위해 gomniauth시도 할 수 있습니다 .

그러나 인증 방법은 앱에 따라 다릅니다.

인증은 http.Handlers에 상태 / 컨텍스트를 소개하며 최근에 이에 대한 논의가있었습니다.

컨텍스트 문제에 대한 잘 알려진 솔루션 여기에 설명 된 고릴라 / 컨텍스트Google 컨텍스트 입니다.

나는 go-on / wrap 에서 글로벌 상태가 필요없는 더 일반적인 솔루션을 만들었습니다.이 상태는 함께 사용하거나 다른 두 가지없이 사용할 수 있으며 컨텍스트 프리 미들웨어와 잘 통합됩니다.

wraphttpauth 는 go-on / wrap과 go-http-auth의 통합을 제공합니다.


JWT (JSON Web Token)를 사용하는 것이 좋습니다. 해결 된 것으로 표시된 답변에는 단점이 있습니다. 이것은 front (user)와 back (server / db)을 한 여행입니다. 사용자가 인증을 필요로하는 빈번한 요청을 수행하면 서버 및 데이터베이스에 대한 요청이 부풀려집니다. 이 문제를 해결하기 위해 액세스 / 요청이 필요할 때마다 사용자가 사용할 수있는 토큰을 사용자쪽에 저장하는 JWT를 사용하십시오. 토큰 유효성을 확인하기 위해 데이터베이스 및 서버 처리로 이동할 필요가 없습니다.


쿠키 인증을 처리하기위한 또 다른 오픈 소스 패키지는 httpauth 입니다.

(내가 쓴)


Labstack Echo를 살펴보십시오. RESTful API 및 프론트 엔드 애플리케이션의 인증을 특정 API 라우트를 보호하는 데 사용할 수있는 미들웨어로 랩핑합니다.

예를 들어 기본 인증을 설정하는 것은 /admin경로에 대한 새 하위 라우터를 만드는 것만 큼 간단 합니다.

e.Group("/admin").Use(middleware.BasicAuth(func(username, password string, c echo.Context) (bool, error) {
    if username == "joe" && password == "secret" {
        return true, nil
    }
    return false, nil
}))

여기에서 Labstack의 미들웨어 인증 옵션을 모두 참조하십시오.

참고 URL : https://stackoverflow.com/questions/25218903/how-are-people-managing-authentication-in-go

반응형