Я работаю над развертыванием сервера OIDC в golang и пытаюсь получить токен для клиента angular 6 с использованием библиотеки angular-oauth2-oidc здесь .
Моя конфигурация сервера достаточно проста:
func main() {
...
// Register the four manditory OpenID Connect endpoints: discovery, public keys, auth, and token.
http.HandleFunc("/.well-known/openid-configuration", handleDiscovery)
http.HandleFunc("/identity/.well-known/openid-configuration", handleDiscovery)
http.HandleFunc("/publickeys", handlePublicKeys)
http.HandleFunc("/authorize", handleAuthorization)
http.HandleFunc("/token", handleToken)
// Load server TLS configuration for (selective) mutual auth
caCert, err := ioutil.ReadFile("ca.pem")
if err != nil {
log.Fatal(err)
}
caCertPool := x509.NewCertPool()
caCertPool.AppendCertsFromPEM(caCert)
// Setup HTTPS client
tlsConfig := &tls.Config{
ClientCAs: caCertPool,
// NoClientCert
// RequestClientCert
// RequireAnyClientCert
// VerifyClientCertIfGiven
// RequireAndVerifyClientCert
ClientAuth: tls.VerifyClientCertIfGiven,
}
tlsConfig.BuildNameToCertificate()
s := &http.Server{
Addr: ":14001",
TLSConfig: tlsConfig,
}
// Some oauth2 / oidc configuration bits
server.Config.AllowedAccessTypes = osin.AllowedAccessType{osin.AUTHORIZATION_CODE,
osin.REFRESH_TOKEN, osin.PASSWORD, osin.CLIENT_CREDENTIALS, osin.ASSERTION}
server.Config.AllowedAuthorizeTypes = osin.AllowedAuthorizeType{osin.CODE, osin.TOKEN}
log.Fatal(s.ListenAndServeTLS("idp.pem", "idp-key.pem"))
}
Я делаю авторизацию, используя предоставленный клиентский сертификат по пути /authorize
, с tls.PeerCertificates (который прекрасно работает, когда предоставляется сертификат), однако, я вижу противоречивое поведение браузера при попытке пройти через неявный поток из моего углового приложения. Мое "приложение" - это очень простой пример приложения, которое я пытаюсь собрать для демонстрации - в нем есть кнопка с надписью "логин", которая перенаправляет браузер на конечную точку OIDC /authorize
, используя функцию location.href = <endpoint>/authorize
javascript.
Насколько я могу судить, при открытии нового браузера может произойти одно из двух:
- Перейдите к угловому приложению. Нажмите кнопку входа. Открывается новая страница, и моя конечная точка авторизации возвращает неверный запрос, потому что у запроса нет сертификата. Обновите страницу, и она продолжает демонстрировать то же поведение.
- Перейдите непосредственно к конечной точке авторизации с параметрами запроса, зацепленными за неудачное перенаправление в предыдущем случае. Firefox запрашивает сертификат, а затем перенаправляет обратно в угловое приложение. Все хорошо, и последующие нажатия кнопки «Войти» успешно проходят процесс авторизации.
Мои тесты и симптомы, которые я до сих пор видел, заставляют меня думать, что это проблема браузера, возможно, связанная с кешем, но если на моем сервере есть что-то, что я делаю (или нет), которое может это исправить, то это тоже было бы очень полезно.