php - 如何使用 OAuth 刷新 token 更新访问 token ?

标签 php oauth uber-api

我正在为 Uber 创建简单的应用程序。
我已经通过这个 API 解决了 3 个步骤:https://developer.uber.com/docs/authentication
但现在我想刷新 token (第 5 步)。
我收到 access_token、refresh_token、expires_in 值,但我不明白如何设置计时器,以便在expires_in 时间到期时使用refresh_token 刷新用户的 token 。
这里我提供了我的代码示例,我想用refresh_token更新访问 token 。

<?php
session_start();

require_once 'uber_b.php';
require_once 'config.php';


if(isset($_GET['code'])) {
// try to get an access token
$code = $_GET['code'];
$url = 'https://login.uber.com/oauth/token';

/* 
* Create row for function setPostData (uber_b.php)
* All of this rows will be used to build our request
*/
$params = array(
    "code" => $code,
    "client_id" => $client_id,
    "client_secret" => $client_secret,
    "redirect_uri" => $redirect,
    "grant_type" => "authorization_code"
);
//create example of class
$request = new HttpPost($url);
//Connect this class with our settings
$request->setPostData($params);
//Send our request to Uber
$request->send(); 
//Receive response
$responseObj = json_decode($request->getHttpResponse());
//Execute parameters from answer
$user_token = $responseObj->access_token;
//Refresh token 
$refresh_token = $responseObj->refresh_token;
//Time for token
$expires_in = $responseObj->expires_in;

echo "User's token: " . $user_token;
echo "<br>";
echo "Refresh token is: " .$refresh_token ;
echo "<br>";
echo "Time: ".$expires_in;
echo "<br>";
echo "<a href='order.php'>Order a car</a>";
}

//Refresh token
if(isset($responseObj))
{
        $exp_time = time()+2592000;
        try {
            //insert into database
            $stmt = $db->prepare('INSERT INTO token2 (exp_time)
                                      VALUES (:exp_time)
                                    ');
            $stmt->execute(array(
                ':exp_time' => $exp_time
            ));             
        } catch(PDOException $e) {
            echo $e->getMessage();
        }
}
if(time() >= $exp_time)
{
//Parameters for Uber refresh token request(step 5)
$r_params = array(
    "client_id" => $client_id,
    "client_secret" => $client_secret,
    "redirect_uri" => $redirect,
    "grant_type" => "refresh_token",
    "refresh_token" => $refresh_token
    );
 $r_request = new RefreshToken($url);

 $r_request->setPostData($r_params);
 $r_request->send(); 
 $refresh = $refresh_token;
 $r_responseObj = json_decode($r_request->Refresh());

echo "New Refresh token: " . $r_responseObj->refresh_token;
echo "<br>";
}
?>

如您所见,我不提供计时器功能,因为我不知道如何正确使用它。
那么,您能解释一下如何使用refresh_token正确更新access_token吗?
也许我必须使用 setcookie() 或其他方法来解决此任务?

最佳答案

  • 首先根据STEP FIVE: REFRESHING TOKENS来自Authentication docs ,要刷新访问 token ,您需要 HTTP POST 以下参数:

    client_secret=YOUR_CLIENT_SECRET
    client_id=YOUR_CLIENT_ID
    grant_type=refresh_token
    redirect_uri=您的_REDIRECT_URI
    fresh_token=REFRESH_TOKEN

    https://login.uber.com/oauth/v2/token API端点

    您还将发送代码参数,这意味着您将收到错误,因为此附加参数无法在 Uber 服务器上验证。 您得到的错误将是

    HTTP/1.1 401 UNAUTHORIZED
    {"error": "invalid_grant"}  
    
  • 为了能够检查 token 有效性,在使用访问 token 交换代码后,您需要:

    • 在某处保留“access_token”、“expires_in”、“refresh_token”和一个以秒为单位的 UNIX 时间戳,表示当前时间和日期,我们称之为“itime”。

    • 可以存储此信息的位置多种多样: session 、文件、数据库、内存缓存等,具体取决于您希望如何处理 token 过期和自动用户登录(如果您已经保存了 token )并且没有过期,那么您不必让用户再次登录。

    • 在向 Uber API 发出每个 HTTP 请求之前,您首先通过从用户访问 token 的存储位置检索“itime”和“expires_in”来检查访问 token 是否已过期,然后确保 time() < "itime"+"expires_in"成立。
      如果条件为假,则您需要刷新访问 token 。

    • 请记住,刷新访问 token 也会更改刷新 token ,因此您需要替换 uuid 标识的当前用户的当前“access_token”、“refresh_token”和“expires_in”。

    • 鉴于访问 token 的当前过期时间为 30 天(2592000 秒),我建议您将访问 token 数据存储在数据库表中,因为 PHP session 的生命周期很短(默认情况下 session.gc_maxlifetime 为 1440) php.ini 中的秒/24 分钟),用户也不会一直停留在您的应用/网站上。
    • 此外,如果您允许用户从多个设备/地点登录 Uber,仅检查过期时间是不够的,因为每次用户登录后,之前的所有访问/刷新 token 都会失效。因此,用户在第二台设备上登录后,您可能会在第一台设备上拥有无效的访问/ token 以及有效的过期时间。 在这种情况下,为了确定访问 token 是否仍然有效,我建议您向 GET /v1/me 发出额外的 HTTP 请求。使用访问 token 的端点。如果有效,则 token 仍然有效,否则 token 已过期/已失效,您需要请求用户在第一台设备上重新登录。

tl;dr 您不需要计时器,您需要在向 Uber API 发出每个 HTTP 请求之前检查访问 token 是否仍然有效。
为此,您需要保留 token 详细信息 + UNIX 时间戳。

关于php - 如何使用 OAuth 刷新 token 更新访问 token ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36744432/

相关文章:

Node、Express、Oauth2 和 Passport 的 Angularjs CORS 问题

ios - 优步 API iOS OAuth 2.0

php - ACF Repeater 字段不输出图像

php - virtctl 在通过命令行执行时有效,但在 php exec() 中无效

php - Symfony2 的高级概念,在开始我的 bundle 之前我应该​​学习哪些概念?

api - Jawbone UP API oAuth 和访问 token

ruby - 从 OAuth 安全存储 token / secret /等的正确方法?

php - 用不同的名字下载

post - 优步API |为 Ride 请求请求访问 token 返回 'invalid_grant' 错误

uber-api - 优步 API - 司机