OAuth2 を一般的な OAuth2 プロバイダーと連携させるのに苦労しています。これが状況です。
サービスは、承認したい場所に OAuth2 認証方法を提供します。satellizer 用に次の構成を持つ AngularJS アプリを作成しました。
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 サービスをターゲットとするリクエストが送信されていることがわかります。
次に、「user/authorize/token」URL にフックする node.js サービスを用意しました。コードは次のとおりです。
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」ヘッダーが含まれている可能性があると思いましたが、そうではないようですので、res.end(); で接続を閉じます。
Chrome でリクエストも調べましたが、この正確な名前のヘッダーが見つからないようです。
次に POST リクエストを受け取ります。これには何かが含まれているようです。万歳!次のオブジェクトを取得します。
{
code: "ZFFeat9pWfHzw4rGmjFYwucPRMFnBOkd2odEObvo",
cliendId: "someapp",
redirectiUri: "http://localhost:3000"
}
これは、デコードする必要がある認証コードのように見えます。それが、上記のコードで私が試していることです。残念ながら、これは私にエラーを投げるようです
エラー: セグメントが足りないか多すぎます
これは、私が何か間違ったことをしている可能性があり、行き詰まったことを示しています。
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());
}
うまくいけば、誰かが私を助けることができます! 前もって感謝します。