1faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath/* 2faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath * Copyright (C) 2013 Square, Inc. 3faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath * 4faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath * Licensed under the Apache License, Version 2.0 (the "License"); 5faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath * you may not use this file except in compliance with the License. 6faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath * You may obtain a copy of the License at 7faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath * 8faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath * http://www.apache.org/licenses/LICENSE-2.0 9faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath * 10faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath * Unless required by applicable law or agreed to in writing, software 11faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath * distributed under the License is distributed on an "AS IS" BASIS, 12faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath * See the License for the specific language governing permissions and 14faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath * limitations under the License. 15faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath */ 16faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamathpackage com.squareup.okhttp; 17faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath 18faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamathimport java.io.IOException; 19faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamathimport java.io.UnsupportedEncodingException; 20faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamathimport java.net.Proxy; 21faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamathimport java.net.URL; 22faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamathimport java.util.List; 233c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fullerimport okio.ByteString; 24faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath 25faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath/** 26faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath * Responds to authentication challenges from the remote web or proxy server by 27faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath * returning credentials. 28faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath */ 29faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamathpublic interface OkAuthenticator { 30faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath /** 31faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath * Returns a credential that satisfies the authentication challenge made by 32faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath * {@code url}. Returns null if the challenge cannot be satisfied. This method 33faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath * is called in response to an HTTP 401 unauthorized status code sent by the 34faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath * origin server. 35faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath * 36faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath * @param challenges parsed "WWW-Authenticate" challenge headers from the HTTP 37faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath * response. 38faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath */ 39faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath Credential authenticate(Proxy proxy, URL url, List<Challenge> challenges) throws IOException; 40faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath 41faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath /** 42faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath * Returns a credential that satisfies the authentication challenge made by 43faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath * {@code proxy}. Returns null if the challenge cannot be satisfied. This 44faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath * method is called in response to an HTTP 401 unauthorized status code sent 45faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath * by the proxy server. 46faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath * 47faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath * @param challenges parsed "Proxy-Authenticate" challenge headers from the 48faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath * HTTP response. 49faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath */ 50faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath Credential authenticateProxy(Proxy proxy, URL url, List<Challenge> challenges) throws IOException; 51faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath 52faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath /** An RFC 2617 challenge. */ 53faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath public final class Challenge { 54faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath private final String scheme; 55faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath private final String realm; 56faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath 57faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath public Challenge(String scheme, String realm) { 58faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath this.scheme = scheme; 59faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath this.realm = realm; 60faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath } 61faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath 62faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath /** Returns the authentication scheme, like {@code Basic}. */ 63faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath public String getScheme() { 64faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath return scheme; 65faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath } 66faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath 67faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath /** Returns the protection space. */ 68faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath public String getRealm() { 69faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath return realm; 70faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath } 71faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath 72faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath @Override public boolean equals(Object o) { 73faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath return o instanceof Challenge 74faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath && ((Challenge) o).scheme.equals(scheme) 75faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath && ((Challenge) o).realm.equals(realm); 76faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath } 77faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath 78faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath @Override public int hashCode() { 79faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath return scheme.hashCode() + 31 * realm.hashCode(); 80faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath } 81faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath 82faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath @Override public String toString() { 83faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath return scheme + " realm=\"" + realm + "\""; 84faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath } 85faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath } 86faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath 87faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath /** An RFC 2617 credential. */ 88faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath public final class Credential { 89faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath private final String headerValue; 90faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath 91faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath private Credential(String headerValue) { 92faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath this.headerValue = headerValue; 93faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath } 94faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath 95faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath /** Returns an auth credential for the Basic scheme. */ 96faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath public static Credential basic(String userName, String password) { 97faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath try { 98faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath String usernameAndPassword = userName + ":" + password; 99faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath byte[] bytes = usernameAndPassword.getBytes("ISO-8859-1"); 1003c938a3f6b61ce5e2dba0d039b03fe73b89fd26cNeil Fuller String encoded = ByteString.of(bytes).base64(); 101faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath return new Credential("Basic " + encoded); 102faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath } catch (UnsupportedEncodingException e) { 103faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath throw new AssertionError(); 104faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath } 105faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath } 106faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath 107faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath public String getHeaderValue() { 108faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath return headerValue; 109faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath } 110faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath 111faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath @Override public boolean equals(Object o) { 112faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath return o instanceof Credential && ((Credential) o).headerValue.equals(headerValue); 113faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath } 114faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath 115faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath @Override public int hashCode() { 116faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath return headerValue.hashCode(); 117faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath } 118faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath 119faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath @Override public String toString() { 120faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath return headerValue; 121faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath } 122faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath } 123faf49723fb689c626f69876e718c58018eff8ee7Narayan Kamath} 124