1

IdentityServer 3 を操作するためのテスト アプリを作成しています。これを作成するために AngularJs、Angular Ui Router、および oauth-ng ライブラリを使用しています。私のアプリは、クライアント側で OpenID connect Authorization Code Flow と連携する必要があります。そのため、oauth-ng ライブラリに非常に小さな変更を加えました。oauth-ng lib を使用して IdentityServer3 から認証コードを取得し、$http.post() を使用してそのコードを token-endpoint に送信し、access_token を取得しています。

以下は私のコードです..

JavaScript

.controller('LoginController', function ($scope, $http, $timeout, $location) {

        var getParamsFromUrl = function(url) {
            var splitted = url.split('?');
            splitted = splitted[1].split('&');
            var params = {};

            for (var i = 0; i < splitted.length; i++) {
                var param  = splitted[i].split('=');
                var key    = param[0];
                var value  = param[1];
                params[key] = value
            }
            return params;
        };

        var getToken = function (url, data) {
            return $http.post(url, data);
        };



        if($location.absUrl().split('?')[1]) {
            $scope.params = getParamsFromUrl($location.absUrl());

            var tokenData = {};
            tokenData.grant_type = 'authorization_code';
            tokenData.code = $scope.params.code;
            tokenData.redirect_uri = 'http://localhost:8000/login.html';

            var tokenEndpoint = 'https://localhost:44333/core/connect/token';

            getToken(tokenEndpoint, tokenData)
                .then(function (data, status, headers, config) {
                    console.log(data);
                    console.log(status);
                    console.log(headers);
                    console.log(config);
                });

        }
    });

認証コードが正常に取得され、トークン エンドポイントに接続しようとすると、ブラウザーに次のエラーがスローされます。

オプションhttps://localhost:44333/core/connect/token b @ angular.min.js:87n @ angular.min.js:82$get.f @ angular.min.js:80(匿名関数) @ angular. min.js:112$get.n.$eval @ angular.min.js:126$get.n.$digest @ angular.min.js:123$get.n.$apply @ angular.min.js:126 (匿名関数) @ angular.min.js:17e @ angular.min.js:36d @ angular.min.js:17uc @ angular.min.js:18Jd @ angular.min.js:17(匿名関数) @ angular .min.js:250n.Callbacks.j @ jquery.min.js:2n.Callbacks.k.fireWith @ jquery.min.js:2n.extend.ready @ jquery.min.js:2I @ jquery.min.js :2

XMLHttpRequest はhttps://localhost:44333/core/connect/tokenを読み込めません。要求されたリソースに「Access-Control-Allow-Origin」ヘッダーがありません。したがって、オリジン ' http://localhost:8000 ' へのアクセスは許可されません。応答には HTTP ステータス コード 405 がありました。

次に、このコード行を使用してアプリ構成で $httpProvider を構成しようとしました..私の構成は次のようになります。

.config(function ($locationProvider, $httpProvider) {
        $locationProvider.html5Mode(true);
        $httpProvider.defaults.withCredentials = true; // <= Added this
    });

それでも同じ問題が発生します。クライアント側からこの問題を解決するにはどうすればよいですか? クライアント側からこれを修正できますか?

4

2 に答える 2

1

要求しているサービスは CORS を許可していません (応答の一部としてアクセス制御が送信されません)。ヘッダー Access-Control-Allow-Origin: * を応答の一部として含める必要があります。

これを参照してください: http://www.html5rocks.com/en/tutorials/cors/

これも参照してください: http://better-inter.net/enabling-cors-in-angular-js/

于 2015-04-24T05:05:25.823 に答える
0

コード許可フローがサーバー側アプリケーション用であることを確認してください。クライアントの秘密を「秘密」に保つことができる場合にのみ、コード付与を使用する必要があります。

暗黙的なフローを使用しない理由はありますか? このようにして、トークンの代わりにリダイレクトでトークンの戦いを取得します。

このページでは、フローについて説明します。http://connect2id.com/learn/openid-connect

于 2016-03-28T18:10:41.470 に答える