Package de.uhilger.httpserver.oauth
Class BearerAuthenticator
- java.lang.Object
-
- com.sun.net.httpserver.Authenticator
-
- de.uhilger.httpserver.oauth.BearerAuthenticator
-
public class BearerAuthenticator extends Authenticator
Die Klasse Authenticator authentifziert gemäß OAuth-Spezifikation "The OAuth 2.0 Authorization Framework: Bearer Token Usage" https://datatracker.ietf.org/doc/html/rfc6750 weitere Info-Links https://www.oauth.com/oauth2-servers/making-authenticated-requests/refreshing-an-access-token/ https://swagger.io/docs/specification/authentication/bearer-authentication/
-
-
Nested Class Summary
-
Nested classes/interfaces inherited from class com.sun.net.httpserver.Authenticator
Authenticator.Failure, Authenticator.Result, Authenticator.Retry, Authenticator.Success
-
-
Field Summary
Fields Modifier and Type Field Description static StringAUTHORIZATIONstatic StringBEARERstatic StringERRORstatic StringERROR_DESCprotected Keykeyder Schluessel zur Signatur von Tokensstatic StringMSG_INVALID_TOKENstatic StringMSG_TOKEN_EXPIREDstatic StringREALMstatic intSC_UNAUTHORIZEDStatus code Unauthorized (401)static StringSTR_BLANKstatic StringSTR_COMMAstatic StringSTR_EMPTYstatic StringSTR_EQUALstatic StringSTR_QUOTEstatic StringSTR_SLASHstatic StringWWW_AUTHENTICATE
-
Constructor Summary
Constructors Constructor Description BearerAuthenticator()
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description Authenticator.Resultauthenticate(HttpExchange exchange)protected StringgetPrincipalAuthRealm(HttpExchange exchange)Den Namen des Realms bestimmen, wie er fuer authentifizierte Benutzer vom Principal ausgegeben wirdprotected StringgetWWWAuthRealm(HttpExchange exchange)Den Eintrag fuer das 'realm'-Attribut im WWW-Authenticate Header bestimmenbooleanhasRole(String userId, String roleId)Pruefen, ob ein Nutzer eine Rolle hatLoginResponselogin(HttpExchange e, String userId, String password)AnmeldenLoginResponserefresh(String refreshToken)voidsetExpireSeconds(long seconds)Die Dauer der Gueltigkeit einer Authentifizierung in SekundenvoidsetPrincipalAuthRealm(String principalAuthRealm)Den Namen des Realms setzen, wie er fuer authentifizierte Benutzer vom Principal ausgegeben werden sollvoidsetRealm(de.uhilger.httpserver.auth.realm.Realm realm)Den Realm dieses Authenticators setzenvoidsetRefreshExpireSeconds(long seconds)Die Dauer der Gueltigkeit eines Refresh-Token in SekundenvoidsetRefreshSeconds(long seconds)Die Dauer bis eine Authentifizierung eine Erneuerung benoetigt in SekundenvoidsetWWWAuthRealm(String wwwAuthRealm)Den Eintrag fuer das 'realm'-Attribut zur Nutzung im WWW-Authenticate Header setzenprotected Authenticator.Resultunauthorized(HttpExchange exchange)Wenn die Anfrage keinen Token enthaelt HTTP/1.1 401 Unauthorized WWW-Authenticate: Bearer realm="example"protected Authenticator.ResultunauthorizedExpired(HttpExchange exchange)Wenn die Anfrage eine Token enthaelt, der gemaess setRefreshSeconds abgelaufen ist und einen Refresh erfordert.StringvalidateRefreshToken(String refreshToken)Bis auf weiteres wird hier der Token nur darauf geprueft, ob er ein gueltiger JWT ist, der mit dem Schluessel dieses Authenticators erzeugt wurde.
-
-
-
Field Detail
-
STR_SLASH
public static final String STR_SLASH
- See Also:
- Constant Field Values
-
STR_BLANK
public static final String STR_BLANK
- See Also:
- Constant Field Values
-
STR_COMMA
public static final String STR_COMMA
- See Also:
- Constant Field Values
-
STR_EMPTY
public static final String STR_EMPTY
- See Also:
- Constant Field Values
-
STR_EQUAL
public static final String STR_EQUAL
- See Also:
- Constant Field Values
-
STR_QUOTE
public static final String STR_QUOTE
- See Also:
- Constant Field Values
-
AUTHORIZATION
public static final String AUTHORIZATION
- See Also:
- Constant Field Values
-
WWW_AUTHENTICATE
public static final String WWW_AUTHENTICATE
- See Also:
- Constant Field Values
-
BEARER
public static final String BEARER
- See Also:
- Constant Field Values
-
REALM
public static final String REALM
- See Also:
- Constant Field Values
-
ERROR
public static final String ERROR
- See Also:
- Constant Field Values
-
ERROR_DESC
public static final String ERROR_DESC
- See Also:
- Constant Field Values
-
MSG_INVALID_TOKEN
public static final String MSG_INVALID_TOKEN
- See Also:
- Constant Field Values
-
MSG_TOKEN_EXPIRED
public static final String MSG_TOKEN_EXPIRED
- See Also:
- Constant Field Values
-
SC_UNAUTHORIZED
public static final int SC_UNAUTHORIZED
Status code Unauthorized (401)- See Also:
- Constant Field Values
-
key
protected final Key key
der Schluessel zur Signatur von Tokens
-
-
Method Detail
-
authenticate
public Authenticator.Result authenticate(HttpExchange exchange)
- Specified by:
authenticatein classAuthenticator
-
login
public LoginResponse login(HttpExchange e, String userId, String password)
Anmelden- Parameters:
userId- die Kennung des Benutzerspassword- das Kennwort des Benutzers- Returns:
- Token oder null, wenn die Anmeldung misslang
-
refresh
public LoginResponse refresh(String refreshToken)
-
validateRefreshToken
public String validateRefreshToken(String refreshToken)
Bis auf weiteres wird hier der Token nur darauf geprueft, ob er ein gueltiger JWT ist, der mit dem Schluessel dieses Authenticators erzeugt wurde. Evtl. wird es in Zukunft noch noetig, weitere Kriterien einzubauen, z.B. ob er zu einem Token aussgegeben wurde, der noch gilt.- Parameters:
refreshToken-- Returns:
- die Benutzerkennung aus dem Refresh Token, wenn der Refresh Token fuer einen Token Refresh akzeptiert wird, null wenn nicht.
-
getWWWAuthRealm
protected String getWWWAuthRealm(HttpExchange exchange)
Den Eintrag fuer das 'realm'-Attribut im WWW-Authenticate Header bestimmen- Parameters:
exchange-- Returns:
- den Ausdruck fuer den WWW-Authenticate Header
-
getPrincipalAuthRealm
protected String getPrincipalAuthRealm(HttpExchange exchange)
Den Namen des Realms bestimmen, wie er fuer authentifizierte Benutzer vom Principal ausgegeben wird- Parameters:
exchange-- Returns:
- den Namen des Realms
-
unauthorizedExpired
protected Authenticator.Result unauthorizedExpired(HttpExchange exchange)
Wenn die Anfrage eine Token enthaelt, der gemaess setRefreshSeconds abgelaufen ist und einen Refresh erfordert. HTTP/1.1 401 Unauthorized WWW-Authenticate: Bearer realm="example", error="invalid_token", error_description="The access token expired"- Parameters:
exchange-- Returns:
-
unauthorized
protected Authenticator.Result unauthorized(HttpExchange exchange)
Wenn die Anfrage keinen Token enthaelt HTTP/1.1 401 Unauthorized WWW-Authenticate: Bearer realm="example"- Parameters:
exchange-- Returns:
- das Ergebnis
-
setRealm
public void setRealm(de.uhilger.httpserver.auth.realm.Realm realm)
Den Realm dieses Authenticators setzen- Parameters:
realm- der Realm
-
hasRole
public boolean hasRole(String userId, String roleId)
Pruefen, ob ein Nutzer eine Rolle hat- Parameters:
userId- die Kennung des NutzersroleId- die Rollen-ID des Nutzers- Returns:
- true, wenn der Nutzer die Rolle hat, false wenn nicht
-
setWWWAuthRealm
public void setWWWAuthRealm(String wwwAuthRealm)
Den Eintrag fuer das 'realm'-Attribut zur Nutzung im WWW-Authenticate Header setzen- Parameters:
wwwAuthRealm- der Text fuer das realm-Attribut im WWW-Autehnticate-Header
-
setPrincipalAuthRealm
public void setPrincipalAuthRealm(String principalAuthRealm)
Den Namen des Realms setzen, wie er fuer authentifizierte Benutzer vom Principal ausgegeben werden soll- Parameters:
principalAuthRealm- der Name des Realms fuer authentifizierte Benutzer
-
setExpireSeconds
public void setExpireSeconds(long seconds)
Die Dauer der Gueltigkeit einer Authentifizierung in Sekunden- Parameters:
seconds- die Sekunden, nach denen die Authentifizierung ungueltig wird
-
setRefreshSeconds
public void setRefreshSeconds(long seconds)
Die Dauer bis eine Authentifizierung eine Erneuerung benoetigt in Sekunden- Parameters:
seconds- die Sekunden, nach denen die Authentifizierung eine Erneuerung benoetigt
-
setRefreshExpireSeconds
public void setRefreshExpireSeconds(long seconds)
Die Dauer der Gueltigkeit eines Refresh-Token in Sekunden- Parameters:
seconds- die Anzhal Sekunden, die ein Refresh-Token gueltig ist
-
-