xref: /unit/src/java/nginx/unit/websocket/BasicAuthenticator.java (revision 1157:7ae152bda303)
1*1157Smax.romanov@nginx.com /*
2*1157Smax.romanov@nginx.com  * Licensed to the Apache Software Foundation (ASF) under one or more
3*1157Smax.romanov@nginx.com  * contributor license agreements.  See the NOTICE file distributed with
4*1157Smax.romanov@nginx.com  * this work for additional information regarding copyright ownership.
5*1157Smax.romanov@nginx.com  * The ASF licenses this file to You under the Apache License, Version 2.0
6*1157Smax.romanov@nginx.com  * (the "License"); you may not use this file except in compliance with
7*1157Smax.romanov@nginx.com  * the License.  You may obtain a copy of the License at
8*1157Smax.romanov@nginx.com  *
9*1157Smax.romanov@nginx.com  *     http://www.apache.org/licenses/LICENSE-2.0
10*1157Smax.romanov@nginx.com  *
11*1157Smax.romanov@nginx.com  * Unless required by applicable law or agreed to in writing, software
12*1157Smax.romanov@nginx.com  * distributed under the License is distributed on an "AS IS" BASIS,
13*1157Smax.romanov@nginx.com  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*1157Smax.romanov@nginx.com  * See the License for the specific language governing permissions and
15*1157Smax.romanov@nginx.com  * limitations under the License.
16*1157Smax.romanov@nginx.com  */
17*1157Smax.romanov@nginx.com package nginx.unit.websocket;
18*1157Smax.romanov@nginx.com 
19*1157Smax.romanov@nginx.com import java.nio.charset.Charset;
20*1157Smax.romanov@nginx.com import java.nio.charset.StandardCharsets;
21*1157Smax.romanov@nginx.com import java.util.Base64;
22*1157Smax.romanov@nginx.com import java.util.Map;
23*1157Smax.romanov@nginx.com 
24*1157Smax.romanov@nginx.com /**
25*1157Smax.romanov@nginx.com  * Authenticator supporting the BASIC auth method.
26*1157Smax.romanov@nginx.com  */
27*1157Smax.romanov@nginx.com public class BasicAuthenticator extends Authenticator {
28*1157Smax.romanov@nginx.com 
29*1157Smax.romanov@nginx.com     public static final String schemeName = "basic";
30*1157Smax.romanov@nginx.com     public static final String charsetparam = "charset";
31*1157Smax.romanov@nginx.com 
32*1157Smax.romanov@nginx.com     @Override
getAuthorization(String requestUri, String WWWAuthenticate, Map<String, Object> userProperties)33*1157Smax.romanov@nginx.com     public String getAuthorization(String requestUri, String WWWAuthenticate,
34*1157Smax.romanov@nginx.com             Map<String, Object> userProperties) throws AuthenticationException {
35*1157Smax.romanov@nginx.com 
36*1157Smax.romanov@nginx.com         String userName = (String) userProperties.get(Constants.WS_AUTHENTICATION_USER_NAME);
37*1157Smax.romanov@nginx.com         String password = (String) userProperties.get(Constants.WS_AUTHENTICATION_PASSWORD);
38*1157Smax.romanov@nginx.com 
39*1157Smax.romanov@nginx.com         if (userName == null || password == null) {
40*1157Smax.romanov@nginx.com             throw new AuthenticationException(
41*1157Smax.romanov@nginx.com                     "Failed to perform Basic authentication due to  missing user/password");
42*1157Smax.romanov@nginx.com         }
43*1157Smax.romanov@nginx.com 
44*1157Smax.romanov@nginx.com         Map<String, String> wwwAuthenticate = parseWWWAuthenticateHeader(WWWAuthenticate);
45*1157Smax.romanov@nginx.com 
46*1157Smax.romanov@nginx.com         String userPass = userName + ":" + password;
47*1157Smax.romanov@nginx.com         Charset charset;
48*1157Smax.romanov@nginx.com 
49*1157Smax.romanov@nginx.com         if (wwwAuthenticate.get(charsetparam) != null
50*1157Smax.romanov@nginx.com                 && wwwAuthenticate.get(charsetparam).equalsIgnoreCase("UTF-8")) {
51*1157Smax.romanov@nginx.com             charset = StandardCharsets.UTF_8;
52*1157Smax.romanov@nginx.com         } else {
53*1157Smax.romanov@nginx.com             charset = StandardCharsets.ISO_8859_1;
54*1157Smax.romanov@nginx.com         }
55*1157Smax.romanov@nginx.com 
56*1157Smax.romanov@nginx.com         String base64 = Base64.getEncoder().encodeToString(userPass.getBytes(charset));
57*1157Smax.romanov@nginx.com 
58*1157Smax.romanov@nginx.com         return " Basic " + base64;
59*1157Smax.romanov@nginx.com     }
60*1157Smax.romanov@nginx.com 
61*1157Smax.romanov@nginx.com     @Override
getSchemeName()62*1157Smax.romanov@nginx.com     public String getSchemeName() {
63*1157Smax.romanov@nginx.com         return schemeName;
64*1157Smax.romanov@nginx.com     }
65*1157Smax.romanov@nginx.com 
66*1157Smax.romanov@nginx.com }
67