首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Bonita 401未经授权的错误

Bonita 401未经授权的错误
EN

Stack Overflow用户
提问于 2014-10-09 17:14:45
回答 2查看 2.6K关注 0票数 1

我正在尝试使用。我的密码在下面。如您所见,在调用任何其他API服务之前,我调用loginservice。它登录到OK 200。但是,当我进行随后的调用来获取进程列表时,我会得到一个401错误。您从第一个调用获得一个JSESSIONID,并且应该将它传递给随后的调用以验证您的身份。

代码语言:javascript
复制
var baseAddress = new Uri(<base address>);
var cookieContainer = new CookieContainer();
using (var handler = new HttpClientHandler() { CookieContainer = cookieContainer })
using (var client = new HttpClient(handler) { BaseAddress = baseAddress })
    {
            HttpResponseMessage result = client.PostAsync("/bonita/loginservice", new StringContent("login=<username>,password=<password>,redirect=false")).Result;
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            HttpResponseMessage result2 = client.GetAsync("/bonita/API/bpm/process").Result;
            result2.EnsureSuccessStatusCode();
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-20 11:39:09

这适用于.Net 2.0 C#,但是有一些有趣的东西要检查。

代码语言:javascript
复制
WebClient wc = new WebClient();
wc.Proxy = WebRequest.GetSystemWebProxy();
//wc.Headers[HttpRequestHeader.AcceptEncoding] = "gzip, deflate";
string strLogin = wc.DownloadString("http://localhost:8080/bonita/loginservice?username=walter.bates&password=bpm&redirect=false");

wc.Headers[HttpRequestHeader.Cookie] = wc.ResponseHeaders[HttpResponseHeader.SetCookie].ToString();
string strCookie = wc.ResponseHeaders[HttpResponseHeader.SetCookie].ToString();

string strProcesses = wc.DownloadString("http://localhost:8080/bonita/API/bpm/process?p=0");

首先,您应该知道如何确定执行的操作是否成功(登录、getProcesses等),当您尝试登录时,您将始终得到标题(例如,"JSESSIONID=50E509D37AC28E2D725CBD45A8112FA7; Path=/bonita; HttpOnly")和OK 200,即使您在Bonita中的登录尝试是不成功的。

上一个示例中成功登录的

1)您必须传递强制表单数据:用户名、密码和重定向--您还必须确保在较低的情况下传递重定向。"False"不能工作,"false"也会工作。因此,对于.Net,假设您有一个property-> Boolean重定向。您必须用redirect.ToString().ToLower()将其小写,因为无论哪种方式,值都是"False",您不希望这样做。

假设您只尝试使用用户名和密码登录,而不传递重定向。结果是,您将得到OK 200和标头,但您也将得到一个错误的响应(响应必须为空),因此在下一个请求(即getProcesses)中,您将得到(401)未经授权的响应。如果您通过redirect=False而不是redirect=false,那么您将得到什么样的结果。完全一样。

2)你必须得到:strLogin="" // the body of the response must be empty strCookie="JSESSIONID=4F67F134840A2C72DBB968D53772FB22; Path=/bonita; HttpOnly"

对于上一个示例中成功的getProcesses,您将传递从登录获得的标头。

代码语言:javascript
复制
wc.Headers[HttpRequestHeader.Cookie] = wc.ResponseHeaders[HttpResponseHeader.SetCookie].ToString();

然后调用进程并获得一个json格式的字符串,例如

代码语言:javascript
复制
"[{\"id\":\"6996906669894804403\",\"icon\":\"\",\"displayDescription\":\"\",\"deploymentDate\":\"2014-11-19 17:57:40.893\",\"description\":\"\",\"activationState\":\"ENABLED\",\"name\":\"Travel request\",\"deployedBy\":\"22\",\"displayName\":\"Travel request\",\"actorinitiatorid\":\"4\",\"last_update_date\":\"2014-11-19 17:57:41.753\",\"configurationState\":\"RESOLVED\",\"version\":\"1.0\"}]"

(或[]指空的json)

如果cookie没有正确传递,您将再次得到401错误。

.Net 4.5.1的解决方案

代码语言:javascript
复制
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using System.Threading.Tasks;
using System.Web;


namespace BonitaRestApi
{
    class BonitaApi
    {
        private CookieCollection collection;
        string strCookietoPass;
        string sessionID;

        static void Main(string[] args)
        {
            BonitaApi obj = new BonitaApi();
            Task login = new Task(obj.Login);
            login.Start();
            login.Wait();
            Console.ReadLine();

            Task GetProcesses = new Task(obj.GetProcesses);
            GetProcesses.Start();
            GetProcesses.Wait();
            Console.ReadLine();

            Task logout = new Task(obj.Logout);
            logout.Start();
            logout.Wait();
            Console.ReadLine();

        }

        public async void Login()
        {
            const string url = "http://localhost:8080/bonita/";

            var cookies = new CookieContainer();
            var handler = new HttpClientHandler();
            handler.CookieContainer = cookies;

            using (var client = new HttpClient(handler))
            {
                var uri = new Uri(url);
                client.BaseAddress = uri;
                //client.DefaultRequestHeaders.Accept.Clear();
                //client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

                var content = new FormUrlEncodedContent(new[] 
                {
                    new KeyValuePair<string, string>("username", "helen.kelly"), 
                    new KeyValuePair<string, string>("password", "bpm"), 
                    new KeyValuePair<string, string>("redirect", "false"), 
                    new KeyValuePair<string, string>("redirectUrl", ""), 
                });

                HttpResponseMessage response = await client.PostAsync("loginservice", content);

                if (response.IsSuccessStatusCode)
                {
                    var responseBodyAsText = await response.Content.ReadAsStringAsync();

                    if (!String.IsNullOrEmpty(responseBodyAsText))
                    {
                        Console.WriteLine("Unsuccessful Login.Bonita bundle may not have been started, or the URL is invalid.");
                        return;
                    }

                    collection= cookies.GetCookies(uri);
                    strCookietoPass = response.Headers.GetValues("Set-Cookie").FirstOrDefault();

                    sessionID = collection["JSESSIONID"].ToString();

                    Console.WriteLine(string.Format("Successful Login Retrieved session ID {0}", sessionID));
                        // Do useful work 
                }
                else
                {
                    Console.WriteLine("Login Error" + (int)response.StatusCode + "," + response.ReasonPhrase);
                }

            }
        }

        public async void Logout()
        {
            const string url = "http://localhost:8080/bonita/";

            var cookies = new CookieContainer();
            var handler = new HttpClientHandler();
            handler.CookieContainer = cookies;

            using (var client = new HttpClient(handler))
            {
                var uri = new Uri(url);
                client.BaseAddress = uri;

                var content = new FormUrlEncodedContent(new[] 
                {
                    new KeyValuePair<string, string>("redirect", "false")
                });

                HttpResponseMessage response = await client.PostAsync("logoutservice", content);

                if (response.IsSuccessStatusCode)
                {
                    var responseBodyText = await response.Content.ReadAsStringAsync();

                    if (!String.IsNullOrEmpty(responseBodyText))
                    {
                        Console.WriteLine("Unsuccessful Logout.Bonita bundle may not have been started, or the URL is invalid.");
                        return;
                    }

                    Console.WriteLine("Successfully Logged out.");
                }
                else
                {
                    Console.WriteLine("Logout Error" + (int)response.StatusCode + "," + response.ReasonPhrase);
                }

            }
        }

        public async void GetProcesses()
        {

            var handler = new HttpClientHandler();

            Cookie ok = new Cookie("Set-Cookie:",strCookietoPass);

            handler.CookieContainer.Add(collection);

            using (var client = new HttpClient(handler))
            {

                var builder = new UriBuilder("http://localhost/bonita/API/bpm/process");
                builder.Port = 8080;

                var query = HttpUtility.ParseQueryString(builder.Query);
                query["p"] = "0";
                query["c"] = "10";
                builder.Query = query.ToString();

                Uri uri= new Uri(builder.ToString());
                client.BaseAddress = uri;

                HttpResponseMessage response = await client.GetAsync(uri.ToString());

                if (response.IsSuccessStatusCode)
                {
                    var responseBodyText = await response.Content.ReadAsStringAsync();

                    if (String.IsNullOrEmpty(responseBodyText))
                    {
                        Console.WriteLine("Unsuccessful GetProcesses.Bonita bundle may not have been started, or the URL is invalid.");
                        return;
                    }

                    Console.WriteLine("Successfully GetProcesses:" + responseBodyText);

                }
                else
                {
                    Console.WriteLine("GetProcesses Error" + (int)response.StatusCode + "," + response.ReasonPhrase);
                }

            }
        }
    }
}
票数 2
EN

Stack Overflow用户

发布于 2017-01-19 08:40:08

对于每一个非获取请求,我都有相同的问题(401错误)。

通过查看CSRF文档:http://documentation.bonitasoft.com/7.4?page=csrf-security,我终于解决了这个问题。

(请参见“对REST调用有影响吗?”(一节)

成功登录后,您必须在请求中添加一个特殊的标题:

代码语言:javascript
复制
key: X-Bonita-API-Token

value: the one you got after your login (check the relevant cookie)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26284249

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档