Каталог Поиск 0 Сравнить 0 Закладки 0 Корзина Войти
Каталог
105082, Москва, ул. Фридриха Энгельса, 75с21, БЦ Бауманский ИТКОЛ
Пн - Пт: с 09-00 до 18-00 Сб: с 10-00 до 18-00 Вс: выходной
Страницы: 1
RSS
При использовании Java/JSP httpclient для авторизации гостей произошла ошибка в Unifi 3.2.1 на Windows Server 2012., UniFi Network
 
Привет, мне нужна помощь с правильным способом авторизации гостя с помощью Java/JSP кода, работающего на контроллере UniFi. Я пытался сделать это, основываясь на следующем примере: https://code.google.com/p/unifiutils/source/browse/trunk/guest-portal/paypal-standard/UniFi/webapp/ROOT/paypal_ipn.jsp?spec=svn2&r=2. Вход в контроллер работает отлично. Проверил также через Browser-URL: https://localhost:8443/login?login=login&username=unif&password=unifi.

После выполнения authorize я получаю следующий код:
{ "data" : [], "meta" : { "rc" : "ok"}}

То же самое с Browser-URL: https://localhost:8443/api/s/default/cmd/stamgr/?json={'cmd':'authorize-guest','mac':'88:44:f6:b9:ec:a4','minutes':'360','bytes':'500'} и гость так и остается в ожидании навсегда.

Есть ли рабочий пример кода для Java/JSP для UniFi 3.21? Я использую правильный синтаксис / Json-запросы?

Заранее спасибо.
Max

Вот основной код:
----------------------------------------------------------------------------------------------------------------------------------------

<%@ page import="java.util.*" %>
<%@ page import="java.net.*" %>
<%@ page import="java.io.*" %>
<%@ page import="org.apache.log4j.Logger" %>
<%@ page import="org.apache.commons.httpclient.*" %>
<%@ page import="org.apache.commons.httpclient.protocol.*" %>
<%@ page import="org.apache.commons.httpclient.methods.*" %>
<%@ page import="org.apache.commons.httpclient.contrib.ssl.*" %>
<%
   HttpClient httpclient = new HttpClient();
   HttpMethod method = null;
   // allow self signed ssl certs - not used
   Protocol easyhttps = new Protocol("https", new EasySSLProtocolSocketFactory(), 443);
   Protocol.registerProtocol("https", easyhttps);

   method = new GetMethod(UNIFI_ADDR + "/login?login=login&username=" + UNIFI_USER + "&password=" + UNIFI_PASSWORD);
   httpclient.executeMethod(method);

   method = new GetMethod(UNIFI_ADDR + "/api/s/beta/cmd/stamgr/?json=" + URLEncoder.encode("{\"cmd\":\"authorize-guest\",\"mac\":\"" + mac + "\",\"minutes\":\"" + PLAN_MINUTES + "\",\"bytes\":\"" + bytes + "\"}"));
   httpclient.executeMethod(method);

   method.releaseConnection();
   log.info("released connection");
%>
----------------------------------------------------------------------------------------------------------------------------------------
 
Привет, Эндрю! Я изменил код, чтобы он использовал данные в формате JSON (Dim postData As String = "json={'login':'Login', 'username':'omissis', 'password':'omissis'}") как ты и предлагал, но проблема осталась... Лучиано.
 
Привет! Для тех, кто мучается с кодом для авторизации с использованием 4.2.80 через json login в java/jsp, вот пример кода, который должен помочь.

```jsp
<%@ page import="java.util.*" %>
<%@ page import="java.net.*" %>
<%@ page import="java.io.*" %>
<%@ page import="org.apache.log4j.Logger" %>
<%@ page import="org.apache.commons.httpclient.*" %>
<%@ page import="org.apache.commons.httpclient.protocol.*" %>
<%@ page import="org.apache.commons.httpclient.methods.*" %>
<%@ page import="org.apache.commons.httpclient.contrib.ssl.EasySSLProtocolSocketFactory" %>
<%
String UNIFI_ADDR = "https://localhost:8443";
String UNIFI_USER = "ubnt";
String UNIFI_PASSWORD = "pass";
String API_LOGIN_URL = "";
String API_LOGIN_DATA = "";
String API_AUTH_URL = "";
String API_AUTH_DATA = "";
int PLAN_Minutes = 8 * 60;
int PLAN_Megabytes = 100000;
int PLAN_MB_PER_USD = 10;


HttpClient httpclient = new HttpClient();
PostMethod method = null;
StringRequestEntity requestEntity = null;

String mac = request.getParameter("custom");
String paymentAmount = request.getParameter("mc_gross");
String firstName = request.getParameter("first_name");
String lastName = request.getParameter("last_name");
String payerEmail = request.getParameter("payer_email");

//int bytes = Float.valueOf(paymentAmount).intValue() * PLAN_MB_PER_USD;
int bytes = 10000;


if(paymentAmount.equals("1.00")) {
PLAN_Megabytes = 100000;
PLAN_Minutes = 8*60;
}

if(paymentAmount.equals("2.00")) {
PLAN_Megabytes = 100000;
PLAN_Minutes = 8*60;
}

if(paymentAmount.equals("4.99")) {
PLAN_Megabytes = 100000;
PLAN_Minutes = 8*60;
}

if(paymentAmount.equals("7.99")) {
PLAN_Megabytes = 100000;
PLAN_Minutes = 1*24*60;
}

if(paymentAmount.equals("12.99")) {
PLAN_Megabytes = 100000;
PLAN_Minutes = 3*24*60;
}

if(paymentAmount.equals("16.99")) {
PLAN_Megabytes = 100000;
PLAN_Minutes = 7*24*60;
}

if(paymentAmount.equals("22.99")) {
PLAN_Megabytes = 100000;
PLAN_Minutes = 14*24*60;
}

if(paymentAmount.equals("34.99")) {
PLAN_Megabytes = 100000;
PLAN_Minutes = 31*24*60;
}

// allow self signed ssl certs
Protocol easyhttps = new Protocol("https", new EasySSLProtocolSocketFactory(), 443);
Protocol.registerProtocol("https", easyhttps);

API_LOGIN_URL = UNIFI_ADDR + "/api/login";
API_LOGIN_DATA = "{\"username\":\"" + UNIFI_USER + "\",\"password\":\"" + UNIFI_PASSWORD + "\" }";

requestEntity = new StringRequestEntity(API_LOGIN_DATA, "application/json", "UTF-8");


method = new PostMethod(API_LOGIN_URL);
method.setRequestEntity(requestEntity);

  httpclient.executeMethod(method);


API_AUTH_URL = UNIFI_ADDR + "/api/s/myvhod3h/cmd/stamgr";
API_AUTH_DATA = "{\\\"cmd\\\":\\\"authorize-guest\\\",\\\"mac\\\":\\\"" + mac + "\\\",\\\"minutes\\\":\\" + PLAN_Minutes + "\\\",\\\"bytes\\\":\\" + PLAN_Megabytes + "\\"}";

requestEntity = new StringRequestEntity(API_AUTH_DATA, "application/json", "UTF-8");

method = new PostMethod(API_AUTH_URL);
method.setRequestEntity(requestEntity);

httpclient.executeMethod(method);

method.releaseConnection();
```

KR,
Mark
 
Привет, для авторизации можешь использовать мой пример кода на Java, который работает с контроллером версии 3.2.7. Тебе потребуется использовать последний HTTP-клиент от Apache.

public static final String HTTP_HTTPS = "https";
public static final String UNIFI_HOST = "IP-адрес контроллера";
public static final int UNIFI_PORT = PORT контроллера;
public static final String UNIFI_LOGIN_PATH = "/login";
public static final String UNIFI_AUTHORIZATION_PATH = "/api/cmd/stamgr";
public static final String UNIFI_LOGUT_PATH = "/logout";

public static void main(String[] args) throws UnknownHostException,
IOException, KeyManagementException, NoSuchAlgorithmException,
KeyStoreException, URISyntaxException {

URI loginUri = new URIBuilder().setScheme(HTTP_HTTPS)
.setHost(UNIFI_HOST).setPort(UNIFI_PORT)
.setPath(UNIFI_LOGIN_PATH).setParameter("login", "login")
.setParameter("username", "admin")
.setParameter("password", "admin").build();

URI authUri = new URIBuilder().setScheme(HTTP_HTTPS)
.setHost(UNIFI_HOST).setPort(UNIFI_PORT)
.setPath(UNIFI_AUTHORIZATION_PATH)
.build();

URI logoutUri = new URIBuilder().setScheme(HTTP_HTTPS)
.setHost(UNIFI_HOST).setPort(UNIFI_PORT)
.setPath(UNIFI_LOGUT_PATH).build();

SSLContextBuilder builder = new SSLContextBuilder();
builder.loadTrustMaterial(null, new TrustSelfSignedStrategy());
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(builder.build(),SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);
CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build();

//Login
System.out.println(loginUri);
HttpPost loginPost = new HttpPost(loginUri);
CloseableHttpResponse response = httpclient.execute(loginPost);
try {
System.out.println(response.getStatusLine());
HttpEntity entity = response.getEntity();
EntityUtils.consume(entity);
} finally {
response.close();
}

//Authorization
System.out.println(authUri);
List<NameValuePair> nvps = new ArrayList<NameValuePair>();
nvps.add(new BasicNameValuePair("json", "{\"cmd\":\"authorize-guest\",\"mac\":\"08:11:96:c1:0e:44\",\"minutes\":\"120\"}"));
HttpPost authorizationPost = new HttpPost(authUri);
authorizationPost.setEntity( new UrlEncodedFormEntity(nvps));
CloseableHttpResponse response2 = httpclient.execute(authorizationPost);
try {
System.out.println(response2.getStatusLine());
HttpEntity entity = response2.getEntity();
EntityUtils.consume(entity);
} finally {
response2.close();
}

//Logout
System.out.println(logoutUri);
HttpPost logout = new HttpPost(logoutUri);
CloseableHttpResponse response3 = httpclient.execute(logout);
try {
System.out.println(response3.getStatusLine());
HttpEntity entity = response2.getEntity();
EntityUtils.consume(entity);
} finally {
response3.close();
}
httpclient.close();

}
 
Понял — однако оба контроллера версии 3.x, я думал, ты говорил, что у тебя есть один 3.x, а другой 4.x? Спасибо, Эндрю.
 
Данные контроллера отправлены с моей личной почты lbampi1961@gmail.com. Спасибо, Лусиано.
 
Конечно, но сначала убедись, что ты изменил пароль на что-то другое. Можешь отправить детали Эндрю по адресу andrew@digitallivingsolutions.co.uk. Всего доброго, Эндрю.
 
Привет, спасибо за помощь... Я до сих пор не могу заставить это работать. Поведение такое же, как с моим кодом: я могу войти в систему; после `s = client.UploadString("/api/login", "{ 'username' : 'username', 'password' : 'password' }");` я получаю HTML-код страницы основного контроллера - когда я использую `s = client.UploadString("/api/s/default/stat/device", "{}");` я получаю "Error 401". Что, если я дам тебе IP-адрес и учетные данные моего тестового контроллера?... Не мог бы ты быть так любезен и помочь мне найти выход из этой ситуации?

Лучиано
 
Они работают под Windows — вот немного C# для того, чтобы сделать то же самое:

```csharp
private void button1_Click(object sender, EventArgs e)
{
   ServicePointManager.ServerCertificateValidationCallback = ValidateServerCertificate;

   ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;

   CookieContainer container = new CookieContainer();

   client = new WebClientWithCookies(container);

   client.BaseAddress = "https://ipofcontroller:8443";

   string s = client.UploadString("/api/login", "{ 'username' : 'username', 'password' : 'password' }");

   s = client.UploadString("/api/s/default/stat/device", "{}");
}

public static bool ValidateServerCertificate(object sender, X509Certificate certificate, X509Chain chain, SslPolicyErrors sslPolicyErrors)
{
   return true;
}
```
 
Не работает и это... (ни в 3.2.7 Windows, ни в 4.0 Windows). Может, API не работают под Windows? Luciano
 
Попробуй просто {'username':''omissis', 'password':''omissis'} Это работает для API версии 4.x.

Удачи,
Andrew
 
Думаю, в более поздних версиях 3.2.x процесс входа изменился с "login=Login&username=omissis&password=omissis" на данные в формате JSON. Это точно так для версий контроллера 4.x. Удачи,Andrew.
 
Установил 3.2.5 на Windows 2008 Server, и проблема та же самая… не удается аутентифицировать пользователей: ошибка 401 Unauthorized.
 
Привет, у меня возникла похожая проблема. У меня есть код на vb.net, который я использовал в течение нескольких месяцев против 3.1.1 на Ubuntu, и он всегда работал отлично. Теперь мне пришлось перейти на 3.2.7 на Windows Server 2012, и код не аутентифицирует пользователей... Я получаю тот же самый результат, что и maswifi. Есть какие-нибудь предложения? Спасибо за любую помощь.

Luciano

Вот мой код:

```vb.net
ServicePointManager.ServerCertificateValidationCallback = AddressOf TrustAllCertificateCallback
'**** LOG IN
Try
   System.Net.ServicePointManager.Expect100Continue = False
   Dim postData As String = "login=Login&username=omissis&password=omissis"
   Dim tempCookies As New CookieContainer
   Dim encoding As New UTF8Encoding
   Dim byteData As Byte() = encoding.GetBytes(postData)
   Dim postReq As HttpWebRequest = DirectCast(WebRequest.Create("https://omissis.com:8443/login"), HttpWebRequest)
   postReq.Method = "POST"
   postReq.KeepAlive = True
   postReq.CookieContainer = tempCookies
   postReq.ContentType = "application/x-www-form-urlencoded"
   postReq.Referer = "http://192.168.1.10/"
   postReq.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2.3) Gecko/20100401 Firefox/4.0 (.NET CLR 3.5.30729)"
   postReq.ContentLength = byteData.Length
   Dim postreqstream As Stream = postReq.GetRequestStream()
   postreqstream.Write(byteData, 0, byteData.Length)
   postreqstream.Close()
   Dim postresponse As HttpWebResponse
   postresponse = DirectCast(postReq.GetResponse(), HttpWebResponse)
   Dim postreqreader As New StreamReader(postresponse.GetResponseStream())
   Dim thepage As String = postreqreader.ReadToEnd
   Me.TextBox1.Text = thepage
Catch ex As Exception
   MsgBox("LOGIN......" & ex.ToString)
End Try

'**** AUTHORIZE
Try
   System.Net.ServicePointManager.Expect100Continue = False
   Dim postData As String = "json={'cmd':'authorize-guest','mac':'4c:0b:3a:6f:51:ad','minutes':240}"
   'Dim postData As String = "json={'cmd':'unauthorize-guest','mac':'4c:0b:3a:6f:51:ad'}"
   Dim encoding As New UTF8Encoding
   Dim byteData As Byte() = encoding.GetBytes(postData)
   Dim postReq As HttpWebRequest = DirectCast(WebRequest.Create("https://omissis.com:8443/api/s/123/cmd/stamgr"), HttpWebRequest)
   postReq.Method = "POST"
   postReq.KeepAlive = True
   postReq.CookieContainer = tempCookies
   postReq.ContentType = "application/x-www-form-urlencoded"
   postReq.Referer = "http://192.168.1.10/"
   postReq.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2.3) Gecko/20100401 Firefox/4.0 (.NET CLR 3.5.30729)"
   postReq.ContentLength = byteData.Length
   Dim postreqstream As Stream = postReq.GetRequestStream()
   postreqstream.Write(byteData, 0, byteData.Length)
   postreqstream.Close()
   Dim postresponse As HttpWebResponse
   postresponse = DirectCast(postReq.GetResponse(), HttpWebResponse)
   Dim postreqreader As New StreamReader(postresponse.GetResponseStream())
   Dim thepage As String = postreqreader.ReadToEnd
   Me.TextBox1.Text = thepage
Catch ex As Exception
   MsgBox("AUTHENTICATION..... " & ex.ToString)
End Try

'**** LOGOUT
Try
   System.Net.ServicePointManager.Expect100Continue = False
   Dim tempCookies As New CookieContainer
   Dim encoding As New UTF8Encoding
   Dim postData As String = ""
   Dim byteData As Byte() = encoding.GetBytes(postData)
   Dim postReq As HttpWebRequest = DirectCast(WebRequest.Create("omissis.com:8443/logout"), HttpWebRequest)
   postReq.Method = "POST"
   postReq.KeepAlive = True
   postReq.CookieContainer = tempCookies
   postReq.ContentType = "application/x-www-form-urlencoded"
   postReq.Referer = "http://192.168.1.10/"
   postReq.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 6.1; ru; rv:1.9.2.3) Gecko/20100401 Firefox/4.0 (.NET CLR 3.5.30729)"
   postReq.ContentLength = byteData.Length
   Dim postreqstream As Stream = postReq.GetRequestStream()
   postreqstream.Write(byteData, 0, byteData.Length)
   postreqstream.Close()
   Dim postresponse As HttpWebResponse
   postresponse = DirectCast(postReq.GetResponse(), HttpWebResponse)
   Dim postreqreader As New StreamReader(postresponse.GetResponseStream())
   Dim thepage As String = postreqreader.ReadToEnd
   Me.TextBox1.Text = "LOGOUT..... " & thepage
Catch ex As Exception
   MsgBox(ex.ToString)
End Try
```
Страницы: 1
Читают тему (гостей: 1)