GVKun编程网logo

如何在PHP的cURL POST HTTP请求中包括Authorization标头?(php curl设置请求头)

8

在本文中,我们将详细介绍如何在PHP的cURLPOSTHTTP请求中包括Authorization标头?的各个方面,并为您提供关于phpcurl设置请求头的相关解答,同时,我们也将为您带来关于andr

在本文中,我们将详细介绍如何在PHP的cURL POST HTTP请求中包括Authorization标头?的各个方面,并为您提供关于php curl设置请求头的相关解答,同时,我们也将为您带来关于android-Web API 2身份验证筛选器-存在Authorization标头时不触发AuthenticateAsync、Angular 4.3 HttpClient不发送Authorization标头、c# – HttpWebRequests在Authorization标头中发送无参数URI、Chapter2UserAuthentication,Authorization,andSecurity(5):的有用知识。

本文目录一览:

如何在PHP的cURL POST HTTP请求中包括Authorization标头?(php curl设置请求头)

如何在PHP的cURL POST HTTP请求中包括Authorization标头?(php curl设置请求头)

我正在尝试通过Gmail OAuth 2.0访问用户的邮件,并且正在通过Google的OAuth 2.0 Playground解决此问题

在这里,他们指定了我需要将其作为HTTP REQUEST发送:

POST /mail/feed/atom/ HTTP/1.1Host: mail.google.comContent-length: 0Content-type: application/jsonAuthorization: OAuth SomeHugeOAuthaccess_tokenThatIReceivedAsAString

我尝试编写代码来发送此请求,如下所示:

$crl = curl_init();$header[] = ''Content-length: 0 Content-type: application/json'';curl_setopt($crl, CURLOPT_HTTPHEADER, $header);curl_setopt($crl, CURLOPT_POST,       true);curl_setopt($crl, CURLOPT_POSTFIELDS, urlencode($accesstoken));$rest = curl_exec($crl);print_r($rest);

无法运作,请提供协助。:)

更新: 我接受了 杰森·麦克里Jason McCreary )的建议,现在我的代码如下所示:

$crl = curl_init();$headr = array();$headr[] = ''Content-length: 0'';$headr[] = ''Content-type: application/json'';$headr[] = ''Authorization: OAuth ''.$accesstoken;curl_setopt($crl, CURLOPT_HTTPHEADER,$headr);curl_setopt($crl, CURLOPT_POST,true);$rest = curl_exec($crl);curl_close($crl);print_r($rest);

但是我没有得到任何输出。我认为cURL在某处默默失败。请帮忙。:)

更新2: NomikOS 的把戏为我做到了。:) :) :) 谢谢!!

答案1

小编典典

@ jason-mccreary是完全正确的。此外,我建议您使用此代码来获取更多故障信息:

$rest = curl_exec($crl);if ($rest === false){    // throw new Exception(''Curl error: '' . curl_error($crl));    print_r(''Curl error: '' . curl_error($crl));}curl_close($crl);print_r($rest);

编辑1

要进行调试,您可以将其设置CURLOPT_HEADER为true以使用firebug ::
net或类似工具检查HTTP响应。

curl_setopt($crl, CURLOPT_HEADER, true);

编辑2

关于Curl error: SSL certificate problem, verify that the CA cert isOK尝试添加这些标头(仅用于调试,在生产环境中,应将这些选项保留在中true):

curl_setopt($crl, CURLOPT_SSL_VERIFYHOST, false);curl_setopt($crl, CURLOPT_SSL_VERIFYPEER, false);

android-Web API 2身份验证筛选器-存在Authorization标头时不触发AuthenticateAsync

android-Web API 2身份验证筛选器-存在Authorization标头时不触发AuthenticateAsync

当网站在我的本地IIS上运行时,我无法启动简单的身份验证筛选器,这是一个奇怪的问题.如果我发布到Azure,则身份验证筛选器可以正常工作.因此,我怀疑本地IIS上有一个设置,但除了在网站的“身份验证”设置下启用“基本身份验证”之外,我真的不知道它还有什么其他设置.

我创建了一个空Web API 2网站,该网站创建了值控制器.然后,我为身份验证过滤器添加了以下样板代码:-

public class BasicAuthenticationAttribute : Attribute, IAuthenticationFilter
{

    public bool AllowMultiple { get { return false; } }

    public Task AuthenticateAsync(HttpAuthenticationContext context,
                                    CancellationToken cancellationToken)
    {
        var req = context.Request;
        // Get credential from the Authorization header 
        //(if present) and authenticate
        if (req.Headers.Authorization != null &&
            "Basic".Equals(req.Headers.Authorization.Scheme,
            StringComparison.OrdinalIgnoreCase))
        {
            if (TryValidateCredentials(req.Headers.Authorization.Parameter))
            {
                var claims = new List<Claim>()
                            {
                            new Claim(ClaimTypes.Name, "AuthenticatedUser"),
                            new Claim(ClaimTypes.Role, "user")
                            };
                var id = new ClaimsIdentity(claims, "Token");
                var principal = new ClaimsPrincipal(new[] { id });
                // The request message contains valid credential
                context.Principal = principal;
            }
            else
            {
                // The request message contains invalid credential
                context.ErrorResult = new UnauthorizedResult(
                    new AuthenticationHeaderValue[0], context.Request);
            }
        }
        return Task.Fromresult(0);
    }
    private bool TryValidateCredentials(string creds)
    {
        string pair;

        try
        {
            pair = Encoding.UTF8.GetString(Convert.FromBase64String(creds));
        }
        catch (FormatException)
        {
            return false;
        }
        catch (ArgumentException)
        {
            return false;
        }
        var ix = pair.IndexOf(':');
        if (ix == -1) return false;
        var username = pair.Substring(0, ix);
        var pw = pair.Substring(ix + 1);
        if (username != "" && pw != "")
        {
            return true;
        }
        else
        {
            return false;
        }
    }
    public Task ChallengeAsync(HttpAuthenticationChallengeContext context, CancellationToken cancellationToken)
    {
        context.Result = new ResultWithChallenge(context.Result);
        return Task.Fromresult(0);
    }
    public class ResultWithChallenge : IHttpActionResult
    {
        private readonly IHttpActionResult next;
        public ResultWithChallenge(IHttpActionResult next)
        {
            this.next = next;
        }
        public async Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
        {
            var response = await next.ExecuteAsync(cancellationToken);
            if (response.StatusCode == HttpStatusCode.Unauthorized)
            {
                response.Headers.WwwAuthenticate.Add(
                    new AuthenticationHeaderValue("Basic", "Please supply valid credentials"));
            }
            return response;
        }
    }

}

然后,我为ValuesController类添加了以下属性:

[TestBA.Filters.BasicAuthentication]
[Authorize]

我的默认IIS7网站(Windows 7 Home Premium)指向项目文件夹,如果我运行和调试w3wp.exe(托管v4),则在http://192.168.1.11/api/values处访问网站会导致在AuthenticateAsync开始时出现断点.如果我从Android代码调用,我也会遇到相同的断点.但是,如果我使用AsyncHttpClient.setBasicAuth设置基本身份验证标头,或者手动添加标头,则断点将永远不会被命中,并且我会立即获得未经授权的HTTP响应.如果我将网站发布到Azure,则可以正常工作,因此未经调用而未调用AuthenticateAsync的响应仅发生在本地IIS上.如果有帮助,请参见以下Android代码:-

private void setBasicAuth(AsyncHttpClient client){
    client.setBasicAuth("test", "test");
    /*client.addHeader("Authorization",
                       "Basic " + android.util.Base64.encodetoString(
                           "test:test".getBytes(),
                           android.util.Base64.NO_WRAP
                           )
                      );*/
}

我什至在Visual Studio Community 2013中打开了所有可能的异常,以查看是否缺少运行时异常或本机代码异常,但是什么也没有.如果有任何相关性,我正在Android上使用loopj库.如果有任何相关性,我也在本地Android idE“ AIDE”上编写Android代码. IIS日志显示请求是否传入并通过401响应,无论我是否使用基本身份验证标头进行呼叫,因此,在两种情况下,请求无疑都有效.

如果有人能阐明为什么在IIS的本地副本上的请求中指定了基本身份验证标头时,为什么Web API 2身份验证筛选器不会触发,那么我将不胜感激.

解决方法:

我在工作PC上重写了该测试应用程序,但无法使其失败,因此这是一个发现差异的案例.

答案实际上很明显.我盲目地在本地IIS上启用了“基本身份验证”,因为我自然希望在Web API 2网站中使用基本身份验证.错误!在IIS中启用基本身份验证会告诉IIS拦截并处理所有基本身份验证标头,而不将其传递给网站.实际上,它尝试将用户名和密码与本地PC用户帐户进行匹配.我需要的是在IIS中禁用基本身份验证,然后将授权HTTP标头传递到我的网站,并启动AuthenticateAsync.

Angular 4.3 HttpClient不发送Authorization标头

Angular 4.3 HttpClient不发送Authorization标头

我尝试使用Angular的HttpClient发送带有授权标头的请求,但标头未成功设置.

在这里我的代码.

import {HttpClient,HttpHeaders} from '@angular/common/http';


constructor(private http: HttpClient,private auth: AuthService) {
}

sendRequest() {
  this.http.get(this.url,{
    headers: new HttpHeaders().set('Authorization','Bearer ' + this.auth.getAccesstoken())
  }).subscribe(
    data => {
      console.log(data);
    },error => {
      console.log(error);
    }
  );
}

这里是网络调试头源.

OPTIONS /userinfo HTTP/1.1
Host: localhost:8080
Connection: keep-alive
Access-Control-Request-Method: GET
Origin: http://localhost:4200
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML,like Gecko) Chrome/60.0.3112.90 Safari/537.36
Access-Control-Request-Headers: authorization
Accept: */*
Referer: http://localhost:4200/user
Accept-Encoding: gzip,deflate,br
Accept-Language: ja,en-US;q=0.8,en;q=0.6

响应头如下.

HTTP/1.1 400 Bad Request
Access-Control-Allow-Origin: *
Content-Type: text/plain; charset=utf-8
X-Content-Type-Options: nosniff
Date: Sun,27 Aug 2017 23:45:15 GMT
Content-Length: 18

有什么不对?

如果查看问题中包含的标题,您会看到这是一个OPTIONS请求.这表明您正在尝试发出跨站点请求,并且浏览器的CORS(跨源资源共享)协议已启动.

您显然发出了一个GET请求,其中包含一个域(或端口号)的凭据,该域与发出请求的页面的来源不同.事实上,我们从您的标题中看到原点是端口4200(角度开发服务器的标准端口),并且请求是对端口8080(可能是Java后端?).

标准CORS协议用于浏览器通过发送OPTIONS请求进行“预检”检查,以查看是否有一个Access-Control-Allow-Origin标头返回,表明允许来源访问目的地.

如果标题返回ok,那么浏览器将发出GET请求.如果没有,您将收到401回复.

所有这些都是由浏览器完成的,并且不受您的控制.

规范(https://www.w3.org/TR/cors/#cross-origin-request-with-preflight-0)表示,当浏览器将OPTIONS请求作为预检的一部分发送时,它不得包含您的授权标头 – 只会在GET上发送.

所以,不 – 这里没有任何问题 – 它按预期工作.

现在,如果在此之后,您获得401并且GET永远不会被发送,那么您将必须修改服务器以发送适当的Access-Control-Allow-Origin标头以响应OPTIONS请求.

有关CORS的更多信息,请参阅https://developer.mozilla.org/en-US/docs/Web/HTTP/Access_control_CORS

c# – HttpWebRequests在Authorization标头中发送无参数URI

c# – HttpWebRequests在Authorization标头中发送无参数URI

我正在从.NET连接到Web服务,例如:
var request = (HttpWebRequest) WebRequest.Create(uri);
request.Credentials = new NetworkCredential("usr","pwd","domain");
var response = (HttpWebResponse) request.GetResponse();

授权标头如下所示:

Authorization: Digest username="usr",realm="domain",nonce="...",uri="/dir",algorithm="MD5",etc...
    ^^^^^^^^^^

服务器返回(400)错误请求. Chrome或IE发送的标头如下:

Authorization: Digest username="usr",uri="/dir/query?id=1",algorithm=MD5,etc...
    ^^^^^^^^^^^^^^^^^^^^^

我们怀疑URI的不同导致Web服务拒绝400错误的请求.是否有可能使HttpRequest发出包含完整URI的Authorization标头?

解决方法

事实证明,Digest authentication很容易实现.通过我们自己的实现,我们能够使用完整的URI(包括参数)来生成MD5哈希.这解决了问题.

如果将来有人遇到此问题,您可以调用解决方法,如:

var resultText = DigestAuthFixer.GrabResponse("/dir/index.html");

DigestAuthFixer类的代码:

public static class DigestAuthFixer
{
    private static string _host = "http://localhost";
    private static string _user = "Mufasa";
    private static string _password = "Circle Of Life";
    private static string _realm;
    private static string _nonce;
    private static string _qop;
    private static string _cnonce;
    private static DateTime _cnonceDate;
    private static int _nc;

    private static string CalculateMd5Hash(
        string input)
    {
        var inputBytes = Encoding.ASCII.GetBytes(input);
        var hash = MD5.Create().ComputeHash(inputBytes);
        var sb = new StringBuilder();
        foreach (var b in hash)
            sb.Append(b.ToString("x2"));
        return sb.ToString();
    }

    private static string GrabHeaderVar(
        string varName,string header)
    {
        var regHeader = new Regex(string.Format(@"{0}=""([^""]*)""",varName));
        var matchHeader = regHeader.Match(header);
        if (matchHeader.Success)
            return matchHeader.Groups[1].Value;
        throw new ApplicationException(string.Format("Header {0} not found",varName));
    }

    // http://en.wikipedia.org/wiki/Digest_access_authentication
    private static string GetDigestHeader(
        string dir)
    {
        _nc = _nc + 1;

        var ha1 = CalculateMd5Hash(string.Format("{0}:{1}:{2}",_user,_realm,_password));
        var ha2 = CalculateMd5Hash(string.Format("{0}:{1}","GET",dir));
        var digestResponse =
            CalculateMd5Hash(string.Format("{0}:{1}:{2:00000000}:{3}:{4}:{5}",ha1,_nonce,_nc,_cnonce,_qop,ha2));

        return string.Format("Digest username=\"{0}\",realm=\"{1}\",nonce=\"{2}\",uri=\"{3}\"," +
            "algorithm=MD5,response=\"{4}\",qop={5},nc={6:00000000},cnonce=\"{7}\"",dir,digestResponse,_cnonce);
    }

    public static string GrabResponse(
        string dir)
    {
        var url = _host + dir;
        var uri = new Uri(url);

        var request = (HttpWebRequest)WebRequest.Create(uri);

        // If we've got a recent Auth header,re-use it!
        if (!string.IsNullOrEmpty(_cnonce) &&
            DateTime.Now.Subtract(_cnonceDate).TotalHours < 1.0)
        {
            request.Headers.Add("Authorization",GetDigestHeader(dir));
        }

        HttpWebResponse response;
        try
        {
            response = (HttpWebResponse)request.GetResponse();
        }
        catch (WebException ex)
        {
            // Try to fix a 401 exception by adding a Authorization header
            if (ex.Response == null || ((HttpWebResponse)ex.Response).StatusCode != HttpStatusCode.Unauthorized)
                throw;

            var wwwAuthenticateHeader = ex.Response.Headers["WWW-Authenticate"];
            _realm = GrabHeaderVar("realm",wwwAuthenticateHeader);
            _nonce = GrabHeaderVar("nonce",wwwAuthenticateHeader);
            _qop = GrabHeaderVar("qop",wwwAuthenticateHeader);

            _nc = 0;
            _cnonce = new Random().Next(123400,9999999).ToString();
            _cnonceDate = DateTime.Now;

            var request2 = (HttpWebRequest)WebRequest.Create(uri);
            request2.Headers.Add("Authorization",GetDigestHeader(dir));
            response = (HttpWebResponse)request2.GetResponse();
        }
        var reader = new StreamReader(response.GetResponseStream());
        return reader.ReadToEnd();
    }
}

Chapter2UserAuthentication,Authorization,andSecurity(5):

Chapter2UserAuthentication,Authorization,andSecurity(5):

原文出处:http://blog.csdn.net/dba_huangzj/article/details/38844999,专题目录:http://blog.csdn.net/dba_huangzj/article/details/37906349 未经作者同意,任何人不得以原创形式发布,也不得已用于商业用途,本人不负责任何法律责任。 前一篇:http://b

原文出处:http://blog.csdn.net/dba_huangzj/article/details/38844999,专题目录:http://blog.csdn.net/dba_huangzj/article/details/37906349

未经作者同意,任何人不得以“原创”形式发布,也不得已用于商业用途,本人不负责任何法律责任。

前一篇:http://blog.csdn.net/dba_huangzj/article/details/38817915

前言:

登录帐号允许你连到SQL Server,并且如果有数据库用户映射到这个帐号,那么这个帐号也可以访问对应的数据库。默认情况下,他们没有服务器层面的管理操作权。固定服务器角色允许你简化授权和回收权限的操作。

实现:

1. 打开登录属性框,然后选择【服务器角色】页:

image

会看到有下面的服务器角色:

image

它们的功能说明如下:

角色名 描述
bulkadminbulkadmin 固定服务器角色的成员可以运行 BULK INSERT 语句。
dbcreator 固定服务器角色的成员可以创建、更改、删除和还原任何数据库。
diskadmin 固定服务器角色的成员可以管理磁盘文件。
processadmin 固定服务器角色的成员可以终止在数据库引擎实例中运行的进程。
public 默认情况下,所有 SQL Server 用户、组和角色都属于 public 固定服务器角色。
securityadmin 固定服务器角色的成员可以管理登录名及其属性。

他们可以 GRANT、DENY 和 REVOKE 服务器级别的权限。

他们还可以 GRANT、DENY 和 REVOKE 数据库级别的权限。

此外,他们还可以重置 SQL Server 登录名的密码。

serveradmin 固定服务器角色的成员可以更改服务器范围的配置选项和关闭服务器。
setupadmin 固定服务器角色成员可以添加和删除链接服务器,并可以执行某些系统存储过程。
sysadmin 固定服务器角色的成员可以在数据库引擎中执行任何活动。

 2. 可以用下面语句添加服务器角色成员:

ALTER SERVER ROLE <role_name> ADD MEMBER <login>; 
登录后复制

3. 可以使用下面语句查看角色成员:

SELECT  role.name AS role , 
        role.is_fixed_role , 
        login.name AS login 
FROM    sys.server_role_members srm 
        JOIN sys.server_principals role ON srm.role_principal_id = role.principal_id 
        JOIN sys.server_principals login ON srm.member_principal_id = login.principal_id;
登录后复制

原理:

通过添加成员到服务器角色中,可以使用里面的预设管理权限。其中public角色,从2005引入,每个登录帐号自动添加到这个角色中,不能移除这个角色及其成员。与其他固定服务器角色不同,你可以修改public的权限,从而“初始化”所有帐号的默认权限,用下面语句可以查看public的角色权限:

SELECT permission_name, state_desc, SUSER_NAME(grantor_principal_id) 
grantor 
FROM sys.server_permissions 
WHERE grantee_principal_id = SUSER_ID(&#39;public&#39;);
登录后复制

关于如何在PHP的cURL POST HTTP请求中包括Authorization标头?php curl设置请求头的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于android-Web API 2身份验证筛选器-存在Authorization标头时不触发AuthenticateAsync、Angular 4.3 HttpClient不发送Authorization标头、c# – HttpWebRequests在Authorization标头中发送无参数URI、Chapter2UserAuthentication,Authorization,andSecurity(5):的相关信息,请在本站寻找。

本文标签: