【发布时间】:2018-04-16 09:00:01
【问题描述】:
我跟着 JWT 教程https://bshaffer.github.io/oauth2-server-php-docs/overview/jwt-access-tokens/
我已按如下方式创建了 access_token:
$publicKey = file_get_contents(dirname(__FILE__) .'/Keys/pubkey.pem');
$privateKey = file_get_contents(dirname(__FILE__) .'/Keys/privkey.pem');
// create storage
$storage = new \OAuth2\Storage\Memory([
'keys' => [
'public_key' => $publicKey,
'private_key' => $privateKey,
],
'client_credentials' => [
'api' => ['client_secret' => 'secret']
],
]);
$server = new \OAuth2\Server($storage, array(
'use_jwt_access_tokens' => true,
));
$server->addGrantType(new \OAuth2\GrantType\ClientCredentials($storage));
$tokenData = json_decode($server->handleTokenRequest(\OAuth2\Request::createFromGlobals())->getResponseBody(), true);
回应是
{
"access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJpZCI6IjM1NWM5YjEzNjRkNmUzMmM2YTM0YWQ2NDgzMWM2NzZjZjllYmEyZGIiLCJqdGkiOiIzNTVjOWIxMzY0ZDZlMzJjNmEzNGFkNjQ4MzFjNjc2Y2Y5ZWJhMmRiIiwiaXNzIjoiIiwiYXVkIjoiYXBpIiwic3ViIjpudWxsLCJleHAiOjE1MDk3MjQ5NDYsImlhdCI6MTUwOTcyMTM0NiwidG9rZW5fdHlwZSI6ImJlYXJlciIsInNjb3BlIjpudWxsfQ.QzCb-nFYHaiJQcj8NsiAN8WoPo24MC5xIgNxWCCNO1WCPzJ_iZ7In6YWcdfe3xVcJQRUzECrveYmKFZizVf7P2UYeGiZjd0tUqM972YiF_9ZrIEjVN_L9QSfGCCAQlhCvXFUdWrfMyiLjUi4D4LYELKyPpkDrJ-0QG5ngtBX_-Iy2zH7BaXf_AGAIyJPScdVvhs_4trroWSaJn7I8KRMtihZCV6ucAUVjkiXJ5rL6Pyem--3PRXJX6IoOQtbKUyRxwhUZfHefPHWaHUdwJY3f83gRnJrSfXql0KdF5i1SdUf1VGwEldmdHPnGHCfKKVypjeXzaP9lHqeO63CXVeY2A",
"expires_in": 3600,
"token_type": "bearer",
"scope": null,
}
现在我可以按如下方式验证令牌
$publicKey = file_get_contents(dirname(__FILE__) .'/Keys/pubkey.pem');
// no private key necessary
$keyStorage = new \OAuth2\Storage\Memory(array('keys' => array(
'public_key' => $publicKey,
)));
$server = new \OAuth2\Server($keyStorage, array(
'use_jwt_access_tokens' => true,
));
$validation = $server->verifyResourceRequest(\OAuth2\Request::createFromGlobals());
if (!$validation) {
$server->getResponse()->send();
die;
}
因此它验证了令牌,但根据教程有效负载文档,我找不到提取 user_id 或“sub”的方法
{
"id": "394a71988caa6cc30601e43f5b6569d52cd7f6df",
"jti": "394a71988caa6cc30601e43f5b6569d52cd7f6df",
"iss": "issuer_id",
"aud": "client_id",
"sub": "user_id",
"exp": 1483711650,
"iat": 1483708050,
"token_type": "bearer",
"scope": "onescope twoscope"
}
我希望从有效令牌(通过标题)中获取 user_id,并使用它从我的数据库中收集相关的用户数据。我该怎么做?
【问题讨论】:
-
感谢您的链接,我确实阅读了它,但我不明白它对我有什么帮助?我希望将 user_id 存储在令牌中,然后再对其进行解码。 OpenID Connect 示例最后显示 user_id 为空,并且没有讨论存储它。我错过了什么吗?
标签: php authentication oauth-2.0 jwt