OAuth2与Satellizer和通用OAuth2提供程序

时间:2016-03-03 20:33:31

标签: angularjs node.js jwt satellizer oauth2

我在使用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所记录的内容!现在,一旦我启动角度应用程序并开始身份验证,我就会看到该目标来自我的Node服务的请求。

接下来,我的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请求的任何内容。我认为它可能包含授权'标题,但似乎并非如此,所以我用res.end()关闭连接;

我还在Chrome中检查了该请求,但我似乎无法找到具有此确切名称的标头。

接下来我收到一个POST请求。这似乎包含一些东西,万岁!我得到以下对象:

{
    code: "ZFFeat9pWfHzw4rGmjFYwucPRMFnBOkd2odEObvo",
    cliendId: "someapp",
    redirectiUri: "http://localhost:3000"
}

这对我来说就像我需要解码的授权代码一样。这就是你在上面的代码中看到我尝试的内容。不幸的是,这似乎给我一个错误

  

错误:段数不够或太多

这告诉我,我可能做错了什么,而且我卡住了。

我确实有一些似乎适用于其他人的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());
}

希望有人可以帮助我!提前谢谢。

1 个答案:

答案 0 :(得分:1)

对不起伙计们,我已经能够自己解决了。我发现我错过了一些来自POST和GET的URL。之后,来自Satellizer的示例变得清晰,并且几乎可以将它们用作副本。