繁体   English   中英

OAuth2-我的访问令牌是服务器端的机密,是的,那么如何将其与AJAX一起使用?

[英]OAuth2 - my access token is a server-side secret, yes, so how do I use it with AJAX?

我正在使用Brent Shaffer的OAuth2 for PHP( https://github.com/bshaffer/oauth2-server-php

我这样调用内部API:

$data = $fc->callAPI($_SERVER['HTTP_HOST']  . '/api/v1/test-member-search.php',
    $fc->internalAccessTokenForAPI(), null);

callAPI需要url,令牌,数据,并且您可以看到,我有一种获取自己的令牌的方法。 callAPI实际上只是一个cURL包装器:

public function callAPI($fullURL, $token, $data ) {
    $headers = [
        'Accept: */*',
        'Content-Type: application/x-www-form-urlencoded',
        'Authorization: Bearer ' . $token
    ];

    if (!$data) { $data = ["data" => "none"]; }

    // open connection
    $ch = curl_init();

    // set curl options
    $options = [
        CURLOPT_URL => $fullURL,
        CURLOPT_POST => count($data),
        CURLOPT_POSTFIELDS => http_build_query($data),
        CURLOPT_HTTPHEADER => $headers,
        CURLOPT_RETURNTRANSFER => true,
    ];
    curl_setopt_array($ch, $options);

    // execute
    $result = curl_exec($ch);
    curl_close($ch);
    return $result;
}

OAuth2服务器可以使用Authorization标头,或者如果不正确,它可以在POST中检查access_token

因此,这就是我使用PHP访问API的方式,但如何进行AJAX调用,如下所示:

<script type="text/javascript">
    $(document).ready(function() {
        var request;
        $("#searchform").submit(function (event) {
            event.preventDefault();
            var $form = $(this);
            var serializedData = $form.serialize();
            request = $.ajax({
                url: "/api/v1/test-member-search.php",
                type: "post",
                data: serializedData
            });
            ...
            ... other stuff

我的知识到此结束。 我可以通过简单地使用PHP从PHP会话中将令牌作为被称为access_token的隐藏输入access_token ,或者可以将其包含在AJAX请求数据中,但这使访问令牌(具有1小时的寿命) )对浏览器客户端可见。

知道访问令牌可以进行API调用,那么如何通过AJAX调用API并隐藏令牌呢?

我了解您希望您的客户端(用户代理=浏览器)直接调用API,这很好。 在这种情况下,令牌确实在运行您的JS的浏览器选项卡中“可见”。

在这种情况下,您需要将标题“ Authorization:Bearer”添加到您的ajax请求中。

例如:

request = $.ajax({
  url: "/api/v1/test-member-search.php",
  type: "post",
  headers: {
    'Authorization': `Bearer ${accessToken}`
  },
  data: serializedData
});

必须仅在TLS(https)上执行此操作,否则攻击者可能会看到您的令牌。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM