在标头中传递 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”标头