在标题中传递openid-connect oauth2 bearer token

时间:2014-10-08 14:40:21

标签: javascript oauth-2.0 asp.net-web-api2 thinktecture-ident-server openid-connect

背景

我已经实现了Thinktecture.IdentityServer.V3(openID Connect one)。我已将OAuth2持票人令牌以下列形式返回给我的javascript客户端(隐式流程):

{
  "id_token": "eyJ0eXAiOiJKV1QiLCJh...",  // JWT
  "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1Ni..", // JWT
  "token_type": "Bearer",
  "expires_in": "3600",
  "scope": "openid profile read write email",
  "state": "1299139105028949"
}

但是在所有示例中,他们只在调用服务时将access_token传递给资源提供者。

 $.ajax({
         url: 'http://localhost:2727/Account/123/Get',
         headers: {
              Authorization: "Bearer " + $scope.response.access_token
             }
         })

假设

如果我有这个权利,我使用访问令牌进行身份验证。然后我根据id_token中的声明进行授权(我不想进行单独的数据库调用 - 我希望它完全独立)。

问题

如何通过ajax将此信息传递给我的webapi2端点(假设我已经设置了CORS等)以及我需要连接哪些中间件来验证它? (我猜猜其中一个令牌验证器和一个claimManager但是那么多,我无法决定哪一个是正确的使用者)。

非常感谢

2 个答案:

答案 0 :(得分:3)

id_token用于客户端 - 它必须由客户端验证(或者如果客户端没有必要的加密库,则由idsrv中的身份令牌验证端点验证)。然后使用访问令牌访问资源。

答案 1 :(得分:1)

您似乎使用AngularJS,因此可以使用$http服务在标头中设置令牌

例如:

$http.post("/login", credentials).then(function(response) {
    $httpProvider.defaults.headers.common["Authorization"] = "Bearer " + $scope.response.access_token;
});

每次会话都必须执行此操作。

<强>更新

使用jQuery这样的东西

     //This repesent the token you got after login
     var authToken = {
                     "id_token": "eyJ0eXAiOiJKV1QiLCJh...",  // JWT
                     "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1Ni..", // JWT
                     "token_type": "Bearer",
                     "expires_in": "3600",
                     "scope": "openid profile read write email",
                     "state": "1299139105028949"
                     }
     $.ajax({
            url: "http://localhost:2727/Account/123/Get",
            type: "get",
            dataType: "json",
            beforeSend: function (request)
            {
                request.setRequestHeader("Authorization", authToken.token_type + " " + authToken.access_token);
            }
    });