0

GitHub への認証済み API リクエストを機能させるのに非常に苦労しています。GitHub で承認済みアプリケーションを作成し、Auth0 アカウントに接続しました。ユーザーが GitHub アカウントを使用してサインインするのに問題はありませんが、サインインすると、GitHub API に対して認証済みのリクエストを行うことができません (ユーザーの GitHub リポジトリの 1 つに GitHub webhook を設定しようとしています)。資格情報が正しくないため、すべてのリクエストが拒否されます。

GitHub API エンドポイントへの各リクエストで送信される Auth0 によって発行された JWT がありますが、これでは不十分なようです。ユーザーから返された Auth0 プロファイルには access_token が含まれているようですが、これを送信しても機能しません。

Auth0 ログイン コードは次のようになります (Angular API を使用):

angular.module('myApp').controller('LoginCtrl', ['$scope', '$http', 'auth', 'store', '$location',
    function ($scope, $http, auth, store, $location) {
      $scope.login = function () {
        auth.signin({
            authParams: {
               responseType: 'token' // I think this is the default but just in case
            }
        }, function (profile, token) {
            // Success callback
            store.set('profile', profile);
            store.set('token', token);
            $location.path('/');
        }, function () {
            // Error callback
            console.debug("error logging in");
        });
      };
}]);

これはうまくいきます。彼らは私の組織の Auth0 アカウントに関連付けられた GitHub アプリケーションを、要求されたアクセス許可で問題なく承認し、私のアプリケーションに戻ります。その後、彼らの GitHub アカウントに関連付けられた Auth0 プロファイルにアクセスできますが、認証されたリクエストを彼らに代わって GitHub API:

var username = auth.nickname;
var repo = "some_user.github.io"; // todo: get repo from setup process
var url = "https://api.github.com/repos/" + username + "/" + repo + "/hooks/";
var conf = {
    name: "web",
    active: true,
    config: {
        "url": "https://webtask.it.auth0.com/api/run/wt-my-container_com-0/echo?webtask_no_cache=1",
        "content_type": "json"
    }
};
$http.post(url, conf).success(function(data, status) {
    console.log("post successful:");
    console.log(status);
    console.log(data);
});

... GitHub は、さまざまな変数に応じて、要求リソースが存在しない (プライベート データの漏洩を防ぐため) か、不適切な資格情報を提供した (Auth0 プロファイルで提供される「access_token」フィールドを提供しようとした場合) と言って、要求を拒否します。クエリ パラメータとして使用するか、Auth0 アプリケーションのクライアント シークレットを指定するなど)。

Auth0 と GitHub の両方のドキュメントを精査して、正しい手順が何であるかを把握しようとしました (たとえば、OAuth2 トークン フロー全体を自分で実装する必要がありますか? Auth0 がそれを実行する必要があるようです)。これまで試してみましたが、Google で正しい方向に向けられたものは何もありませんでした。これを行うために他の多くの方法を試しましたが、成功しませんでしたが、この投稿をあまり長くしたくありません. どんな助けでも大歓迎です。

4

2 に答える 2

1

私はそれを考え出した。2 つの問題がありました。1 つは、GitHub エンドポイントへの API 呼び出しの最後に末尾のスラッシュが入り込んでいたため、明らかに何かが壊れて、GitHub がリクエストを拒否したことです。もう 1 つは、Authorization に沿って送信するように設定していたことです。 https://auth0.com/docs/client-platforms/angularjs 、具体的にはこの部分:

myApp.config(function (authProvider, $routeProvider, $httpProvider, jwtInterceptorProvider) {
  // ...

  // We're annotating this function so that the `store` is injected correctly when this file is minified
  jwtInterceptorProvider.tokenGetter = ['store', function(store) {
    // Return the saved token
    return store.get('token');
  }];

  $httpProvider.interceptors.push('jwtInterceptor');
  // ...
});

しかし、GitHub は、期待しているトークンが含まれていないため、要求を拒否することを好みません。末尾のスラッシュを削除して上記のコードを削除すると、すべてが期待どおりに機能し始めました。

于 2016-02-16T04:53:49.100 に答える
0

この gitHub ページを見てください。angular では次のようなものです。

//'common' will add the headder to every request.
 $httpProvider.defaults.headers.common["Authorization"] = token YOUR_TOKEN;
于 2016-02-15T03:31:40.017 に答える