在标头中传递 openid-connect oauth2 不记名令牌

Posted

技术标签:

【中文标题】在标头中传递 openid-connect oauth2 不记名令牌【英文标题】:pass openid-connect oauth2 bearer token in header 【发布时间】: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 之一,但有很多我无法确定哪个是正确的使用)。

帮助非常感谢

【问题讨论】:

【参考方案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 吗?

以上是关于在标头中传递 openid-connect oauth2 不记名令牌的主要内容,如果未能解决你的问题,请参考以下文章

keycloak 中请求的资源上不存在“Access-Control-Allow-Origin”标头

在 jQuery AJAX GET 调用中传递请求标头

在标头中传递 JWT

我是不是在发布请求的标头或正文中传递身份令牌?

如何在 SAP NetWeaver Mobile First 适配器中传递标头

如何在所有请求标头中传递授权令牌 - Spring Boot java