Выбор правильной схемы безопасности Goadesign

Я имею дело со своим уровнем безопасности в проекте Goadesign API. У меня есть некоторые сомнения по поводу того, какую схему безопасности мне использовать. Я постараюсь описать весь мой стек, чтобы вы могли получить лучшее представление: во-первых, мне нужно ввести логин в мой goa api, чтобы пользователь мог просматривать свой профиль на Facebook. Я думаю, что код авторизации OAuth2 удовлетворяет моим потребностям, поэтому здесь мой шаг реализации кода авторизации:

  1. Статическое js-приложение открывается через кнопку на html-странице Facebook https://www.facebook.com/v3.2/dialog/oauth?client_id={app-id}&redirect_uri={redirect-uri}&state={state-param}
  2. Логин пользователя
  3. Redirect_uri открывает перенаправление обратно в приложение js, которое получает код из параметров.
  4. Приложение js отправляет запрос, включая код, полученный на шаге 3, на серверную часть goa /oauth2/facebook/access_token конечная точка, которая выполняет вызов в Facebook для обмена кода на токен. После получения ответа токен и информация о пользователе сохраняются в БД, и токен отправляется обратно в приложение js для будущего вызова.

Все идет нормально.

Здесь сомнения:

  1. Я определил следующий дизайн
   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 из бэкэнда, потому что он открывает диалог, с которым пользователь должен взаимодействовать.

  1. Звоню моему /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 все еще имеет смысл быть использованным? Чтобы быть более точным, поток паролей пользователя будет таким: когда имя пользователя и пароль действительны в БД, создайте токен, связанный с пользователем, чтобы отслеживать логин пользователя. Есть ли какая-нибудь лучшая схема, которую я должен использовать, так как мне нужно только для обоих случаи, чтобы проверить, существует ли токен для пользователя на БД.

  1. В разделе авторизации swagger я должен предоставить client_id и client_secret для аутентификации API. Суть в том, что: -Я не хочу делиться с каким-либо сторонним разработчиком внешнего интерфейса своим секретом приложения. -Даже сообщая секрет, конечная точка авторизации находится на бэкэнде, и это возвращает меня к тому, что пользователю нужно взаимодействовать с диалогом входа в Facebook.

Большое спасибо!

0 ответов

Другие вопросы по тегам