【问题标题】:pass openid-connect oauth2 bearer token in header在标头中传递 openid-connect oauth2 不记名令牌
【发布时间】:2014-12-03 06:42:04
【问题描述】:

背景

我已经实现了 Thinktecture.IdentityServer.V3(openID Connect 之一)。我已将 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 等)以及我必须连接哪些中间件来验证它? (我猜是 Token Validators 和 claimManager 之一,但有很多我无法确定哪个是正确的使用)。

帮助非常感谢

【问题讨论】:

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


    【解决方案1】:

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

    【讨论】:

    • 那么您将如何通过 id 令牌中的角色声明来保护资源?或者我在这里错过了什么?谢谢
    • 您不使用 id_token 保护资源。将角色声明放入访问令牌中。 github.com/thinktecture/Thinktecture.IdentityServer.v3/wiki/…
    • 好了,现在明白了!感谢您的帮助。
    • 补充回答@PeterLea,ID令牌仅用于身份,角色基本上是授权手段,因此在访问令牌中有意义。ID令牌用于客户端验证最终用户/资源所有者并使用 ID 令牌获取他的信息,对资源的访问由访问令牌精细控制
    【解决方案2】:

    看来你用的是AngularJS,所以你可以使用$http服务在header中设置token

    例如:

    $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);
                }
        });
    

    【讨论】:

    • thinktecture javascript 隐式示例使用 angular,我实际上使用的是淘汰赛。该演示传递了 access_token,但我还想传递整个 OAuth2 令牌,以便我也可以验证 id_token,如何创建标头以传递该信息?
    • 问题在于“Bearer” + $scope.response.access_token' 仅被传递,而不是整个令牌。我将尝试 'X-AUTH-TOKEN' + $scope .response 看看这能带给我什么
    • 好的,我已经更新了我的 sn-p!这应该是正确的方法。我找到了一些信息here
    • 嗨,sn-p 显示刚刚传递了 access_token。不能以这种方式传递整个令牌吗?我需要在不同的标头中发送 id_token 吗?
    猜你喜欢
    • 1970-01-01
    • 2022-07-09
    • 2014-05-02
    • 2017-11-03
    • 1970-01-01
    • 2016-06-26
    • 1970-01-01
    • 2018-06-24
    • 2019-09-25
    相关资源
    最近更新 更多