您无权查看此页面:使用WordPressPCL的MemberPress插件对WP REST API进行JWT身份验证

时间:2019-10-04 09:59:51

标签: wordpress authentication jwt wordpress-rest-api memberpress

尝试使用WordPressPCL API将JWT身份验证用于WP REST API。

使用WordPressPCL进行身份验证并将帖子和页面发布到WordPress服务器。为了将访问权限限制为仅付费会员,我计划使用MemberPress。我为帖子创建了一个特殊类别,并以此发布。我在MemberPress中设置了一个规则,以仅授予订阅者访问权限。

测试了帖子的访问权限,可以从我的浏览器中查看内容,一切都很好。

问题是,尽管我从JWT / WordPress角度获得了适当的授权,但是当我尝试使用WordPressPCL进行相同操作时,我无权访问内容。看起来MemberPress阻止了通过WordPressPCL来的授权用户,但是当通过Web浏览器来时允许访问。

当我尝试发布页面而不是 posts 时,也会发生同样的事情。我还应该提到,我可以下载所有帖子的元数据,但不能下载每个帖子的内容,这会使我进入“您无权查看此页面”。

下面的代码检索具有特定标题和类别的所有帖子,但所有帖子 myPosts.Content.Rendered ==“您无权查看此页面”

 try
        {
            WordPressClient client = await GetClient(clientURL,userName,password);
            if (await client.IsValidJWToken())
            {
                var posts = await client.Posts.GetAll();
                var myPosts = posts.Where(p => p.Categories[0] == category && p.Title.Rendered == title);
            }

...

我在没有JWT的情况下尝试了类似的事情。我可以进行身份​​验证,但无法检索页面内容:


            CookieContainer cc = new CookieContainer();
            var request = (HttpWebRequest)WebRequest.Create(loginUri);
            request.Proxy = null;
            request.AllowAutoRedirect = false;
            request.CookieContainer = cc;
            request.Method = "post";

            request.ContentType = "application/x-www-form-urlencoded";
            request.ContentLength = requestData.Length;

            using (Stream s = request.GetRequestStream())
                s.Write(requestData, 0, requestData.Length);

            using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
            {
                foreach (Cookie c in response.Cookies)
                    Console.WriteLine(c.Name + " = " + c.Value);
            }

            string newloginUri = "http://localhost/myWP/myPostforToday/";
            HttpWebRequest newrequest = (HttpWebRequest)WebRequest.Create(newloginUri);
            newrequest.Proxy = null;
            newrequest.CookieContainer = cc;
            using (HttpWebResponse newresponse = (HttpWebResponse)newrequest.GetResponse())
            using (Stream resSteam = newresponse.GetResponseStream())
            using (StreamReader sr = new StreamReader(resSteam))
                File.WriteAllText(@"retrievedpage.html", sr.ReadToEnd());

我怀疑MemeberPress规则限制了访问权限,但找不到任何解决方案。非常感谢您提供一些有关如何处理此问题的指南(有或没有MemberPress参与)。

1 个答案:

答案 0 :(得分:0)

改变这个

 var posts = await client.Posts.GetAll();

到:

var posts = await client.Posts.GetAll().Result;

如果你有 Result(),我认为这会奏效,下一个原创;

var client = new WordPressClient("http://wordpress-domain.com/wp-json/");
client.AuthMethod = AuthMethod.JWT;
await client.RequestJWToken("user", "password");
return client;

但你使用:

WordPressClient client = await GetClient(clientURL,userName,password);