Выбор правильной схемы безопасности Goadesign
Я имею дело со своим уровнем безопасности в проекте Goadesign API. У меня есть некоторые сомнения по поводу того, какую схему безопасности мне использовать. Я постараюсь описать весь мой стек, чтобы вы могли получить лучшее представление: во-первых, мне нужно ввести логин в мой goa api, чтобы пользователь мог просматривать свой профиль на Facebook. Я думаю, что код авторизации OAuth2 удовлетворяет моим потребностям, поэтому здесь мой шаг реализации кода авторизации:
- Статическое js-приложение открывается через кнопку на html-странице Facebook
https://www.facebook.com/v3.2/dialog/oauth?client_id={app-id}&redirect_uri={redirect-uri}&state={state-param}
- Логин пользователя
- Redirect_uri открывает перенаправление обратно в приложение js, которое получает код из параметров.
- Приложение js отправляет запрос, включая код, полученный на шаге 3, на серверную часть goa
/oauth2/facebook/access_token
конечная точка, которая выполняет вызов в Facebook для обмена кода на токен. После получения ответа токен и информация о пользователе сохраняются в БД, и токен отправляется обратно в приложение js для будущего вызова.
Все идет нормально.
Здесь сомнения:
- Я определил следующий дизайн
var Oauth2Secure = OAuth2Security("googAuth", func() {
AccessCodeFlow("/authorization", "/oauth2/facebook/access_token")
Scope("my_system:write", "Write to the system")
Scope("my_system:read", "Read anything in there")
})
var _ = Resource("protected_resource", func() {
Description("Is a protected url")
BasePath("/protected_resource")
Security(Oauth2Secure)
Action("list", func() {
Description("List of preotected resource")
Routing(GET("/"))
})
Response(OK)
})
/oauth2/facebook/access_token
конечная точка - это та, на которую я ссылался в потоке на шаге 4, это имеет смысл, но я не понимаю, зачем мне определять /authorization
конечная точка в функции AccessCodeFlow, поскольку это будет конечная точка Facebook. Более того, не имеет смысла выполнять вызов к этому /authorization
из бэкэнда, потому что он открывает диалог, с которым пользователь должен взаимодействовать.
- Звоню моему
/protected_resource
дал мне этот ответ{"id":"KyDW0MOn","code":"no_auth_middleware","status":500,"detail":"Auth middleware for security scheme googAuth is not mounted","meta":{"scheme":"googAuth"}}
, Честно говоря, я реализовал промежуточное программное обеспечение, как предложено в примерах безопасности Гоа
func NewOAuth2Middleware() goa.Middleware {
// Instantiate scheme described in design to retrieve
// Middleware
return func(h goa.Handler) goa.Handler {
return func(ctx context.Context, rw http.ResponseWriter, req *http.Request) error {
token := req.Header["Authorization"]
if token == nil {
return ErrUnauthorized("missing auth header")
}
tok := token[0]
if len(tok) < 9 || !strings.HasPrefix(tok, "Bearer ") {
return ErrUnauthorized("invalid auth header")
}
tok = tok[7:]
// Validate token here against value stored in DB for example
if tok != "valid_token" {
return ErrUnauthorized("invalid token")
}
return h(ctx, rw, req)
}
}
}
Должен ли я действительно использовать Oauth2Secure
Схема безопасности, так как бэкенду нужно просто получить значение токена из заголовка запроса и проверить, существует ли в БД. В случае, когда токен создается непосредственно из бэкэнда, потому что я также предлагаю возможность аутентификации пользователей, которые не используют логин Facebook через имя пользователя и пароль, выполняет ли Oauth2Secure
все еще имеет смысл быть использованным? Чтобы быть более точным, поток паролей пользователя будет таким: когда имя пользователя и пароль действительны в БД, создайте токен, связанный с пользователем, чтобы отслеживать логин пользователя. Есть ли какая-нибудь лучшая схема, которую я должен использовать, так как мне нужно только для обоих случаи, чтобы проверить, существует ли токен для пользователя на БД.
- В разделе авторизации swagger я должен предоставить client_id и client_secret для аутентификации API. Суть в том, что: -Я не хочу делиться с каким-либо сторонним разработчиком внешнего интерфейса своим секретом приложения. -Даже сообщая секрет, конечная точка авторизации находится на бэкэнде, и это возвращает меня к тому, что пользователю нужно взаимодействовать с диалогом входа в Facebook.
Большое спасибо!