带有 Satellizer 和通用 OAuth2 提供程序的 OAuth2
OAuth2 with Satellizer and a generic OAuth2 provider
我很难让 OAuth2 与通用 OAuth2 提供程序一起工作。情况是这样的。
一项服务为我想要授权的地方提供了一种 OAuth2 身份验证方法。我创建了一个 AngularJS 应用程序,它具有以下 satellizer 配置:
authProvider.baseUrl = 'http://localhost:3030/user/authorize';
$authProvider.oauth2({
name: 'customname',
url: '/token',
clientId: 'someapp',
requiredUrlParams: ['scope'],
scope: ['profile'],
authorizationEndpoint: 'http://location.to.oathserver',
redirectUri: 'http://localhost:3000'
});
baseUrl 指向应该处理中间件部分的我的节点服务器。
我还有以下触发身份验证部分的代码。
$scope.authenticate = function(provider) {
$auth.authenticate(provider)
.then(function(response) {
console.log(response);
})
.catch(function() {
//something went wrong
});
}
到目前为止,这一切似乎都运行良好,看起来与 Satellizer 记录的内容非常相似!现在,一旦我启动 angular 应用程序并开始身份验证,我就会看到来自该目标我的节点服务的请求。
接下来,我的 node.js 服务连接到 'user/authorize/token' URL。这是代码:
router.options('/authorize/token', function(req, res, next) {
//var token = req.header('Authorization').split(' ')[1];
res.end();
});
和:
router.post('/authorize/token', function(req, res, next) {
var authCode = req.param('code');
var cliendId = req.param('clientId');
var payload = jwt.decode(authCode, 'mySecret');
});
这就是一切似乎出错的地方。首先,我似乎收到了一个 OPTIONS 请求。我真的不知道如何处理它,因为我似乎无法在文档中找到任何关于 OPTIONS 请求的信息。我认为它可能包含 'Authorization' header 但情况似乎并非如此,所以我用 res.end();
关闭了连接
我也检查了 Chrome 中的请求,但我似乎找不到具有此确切名称的 header。
接下来我收到一个 POST 请求。这似乎确实包含了一些东西,万岁!我得到以下 object:
{
code: "ZFFeat9pWfHzw4rGmjFYwucPRMFnBOkd2odEObvo",
cliendId: "someapp",
redirectiUri: "http://localhost:3000"
}
在我看来,这像是我应该解码的授权码。这就是您在上面的代码中看到的我正在尝试的内容。不幸的是,这似乎给我一个错误
Error: Not enough or too many segments
这告诉我我可能做错了什么,我卡住了。
我确实有一些 PHP 代码似乎适用于其他人,但我不完全理解并且不能真正将代码与我的代码联系起来,因为 PHP 不是我的专长和 node.js/JavaScript 不是他的。所以这是 PHP 代码:
handle_cors(); // Handle CORS for cross domain requests
// Get JSON data
$input = json_decode(file_get_contents("php://input"), true);
// Create Provider
$provider = new SomeApp\OAuth2\Client\Provider\SomeApp([
'clientId' => 'someapp',
'clientSecret' => 'mySecret',
'redirectUri' => $input['redirectUri'],
]);
// Optional: Now you have a token you can look up a users profile data
try {
// Try to get an access token (using the authorization code grant)
$token = $provider->getAccessToken('authorization_code', [
'code' => $input['code']
]);
// We got an access token, let's now get the user's details
$user = $provider->getResourceOwner($token);
header('Content-Type: application/json');
$result = $user->toArray();
$result['token'] = create_token('my-example-key', $user->getId());
echo json_encode($result);
exit();
} catch (Exception $e) {
// Failed to get user details
exit('Oh dear...' . $e->getMessage());
}
希望有人能帮助我!提前致谢。
抱歉各位,我已经自己解决了。我发现我遗漏了一些 URL 到 POST 和 GET from 的内容。之后来自 Satellizer 的示例变得清晰,几乎可以将它们用作副本。
我很难让 OAuth2 与通用 OAuth2 提供程序一起工作。情况是这样的。
一项服务为我想要授权的地方提供了一种 OAuth2 身份验证方法。我创建了一个 AngularJS 应用程序,它具有以下 satellizer 配置:
authProvider.baseUrl = 'http://localhost:3030/user/authorize';
$authProvider.oauth2({
name: 'customname',
url: '/token',
clientId: 'someapp',
requiredUrlParams: ['scope'],
scope: ['profile'],
authorizationEndpoint: 'http://location.to.oathserver',
redirectUri: 'http://localhost:3000'
});
baseUrl 指向应该处理中间件部分的我的节点服务器。
我还有以下触发身份验证部分的代码。
$scope.authenticate = function(provider) {
$auth.authenticate(provider)
.then(function(response) {
console.log(response);
})
.catch(function() {
//something went wrong
});
}
到目前为止,这一切似乎都运行良好,看起来与 Satellizer 记录的内容非常相似!现在,一旦我启动 angular 应用程序并开始身份验证,我就会看到来自该目标我的节点服务的请求。
接下来,我的 node.js 服务连接到 'user/authorize/token' URL。这是代码:
router.options('/authorize/token', function(req, res, next) {
//var token = req.header('Authorization').split(' ')[1];
res.end();
});
和:
router.post('/authorize/token', function(req, res, next) {
var authCode = req.param('code');
var cliendId = req.param('clientId');
var payload = jwt.decode(authCode, 'mySecret');
});
这就是一切似乎出错的地方。首先,我似乎收到了一个 OPTIONS 请求。我真的不知道如何处理它,因为我似乎无法在文档中找到任何关于 OPTIONS 请求的信息。我认为它可能包含 'Authorization' header 但情况似乎并非如此,所以我用 res.end();
关闭了连接我也检查了 Chrome 中的请求,但我似乎找不到具有此确切名称的 header。
接下来我收到一个 POST 请求。这似乎确实包含了一些东西,万岁!我得到以下 object:
{
code: "ZFFeat9pWfHzw4rGmjFYwucPRMFnBOkd2odEObvo",
cliendId: "someapp",
redirectiUri: "http://localhost:3000"
}
在我看来,这像是我应该解码的授权码。这就是您在上面的代码中看到的我正在尝试的内容。不幸的是,这似乎给我一个错误
Error: Not enough or too many segments
这告诉我我可能做错了什么,我卡住了。
我确实有一些 PHP 代码似乎适用于其他人,但我不完全理解并且不能真正将代码与我的代码联系起来,因为 PHP 不是我的专长和 node.js/JavaScript 不是他的。所以这是 PHP 代码:
handle_cors(); // Handle CORS for cross domain requests
// Get JSON data
$input = json_decode(file_get_contents("php://input"), true);
// Create Provider
$provider = new SomeApp\OAuth2\Client\Provider\SomeApp([
'clientId' => 'someapp',
'clientSecret' => 'mySecret',
'redirectUri' => $input['redirectUri'],
]);
// Optional: Now you have a token you can look up a users profile data
try {
// Try to get an access token (using the authorization code grant)
$token = $provider->getAccessToken('authorization_code', [
'code' => $input['code']
]);
// We got an access token, let's now get the user's details
$user = $provider->getResourceOwner($token);
header('Content-Type: application/json');
$result = $user->toArray();
$result['token'] = create_token('my-example-key', $user->getId());
echo json_encode($result);
exit();
} catch (Exception $e) {
// Failed to get user details
exit('Oh dear...' . $e->getMessage());
}
希望有人能帮助我!提前致谢。
抱歉各位,我已经自己解决了。我发现我遗漏了一些 URL 到 POST 和 GET from 的内容。之后来自 Satellizer 的示例变得清晰,几乎可以将它们用作副本。