Javascript 在标头中传递openid connect oauth2承载令牌
背景 我已经实现了Thinktecture.IdentityServer.V3(openID连接)。我已将OAuth2承载令牌以以下形式返回给我的javascript客户端(隐式流):Javascript 在标头中传递openid connect oauth2承载令牌,javascript,oauth-2.0,asp.net-web-api2,thinktecture-ident-server,openid-connect,Javascript,Oauth 2.0,Asp.net Web Api2,Thinktecture Ident Server,Openid Connect,背景 我已经实现了Thinktecture.IdentityServer.V3(openID连接)。我已将OAuth2承载令牌以以下形式返回给我的javascript客户端(隐式流): { "id_token": "eyJ0eXAiOiJKV1QiLCJh...", // JWT "access_token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1Ni..", // JWT "token_type": "Bearer", "expires_in":
{
"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',
headers: {
Authorization: "Bearer " + $scope.response.access_token
}
})
假设
如果我做对了,我就用访问令牌进行身份验证。然后,我根据id_令牌中的声明进行授权(我不想进行单独的DB调用-我希望它完全独立)
问题
我将如何通过ajax(假设我已经设置了CORS等)将这些信息传递给我的webapi2端点?我需要连接什么中间件来验证它?(我猜是一个令牌验证器和一个claimsManager,但是有太多了,我无法决定哪一个是正确的)
非常感谢您的帮助您似乎使用了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);
}
});
id_令牌用于客户端-必须由客户端验证(如果客户端没有必要的加密库,则由idsrv中的标识令牌验证端点验证)。然后使用访问令牌访问资源。thinktecture javascript隐式示例使用angular,我实际上使用的是knockout。演示将传递access_令牌,但我也希望传递整个OAuth2令牌,以便我也可以验证id_令牌,我如何创建标头来传递该信息?问题在于“承载者”“+$scope.response.access_令牌”仅被传递,而不是整个令牌。我将尝试“X-AUTH-TOKEN”+$scope.response,并查看它的作用。好的,我已经更新了我的代码段!这应该是正确的方法。我发现了一些信息嗨,代码片段显示只是传递了访问令牌。难道不可能以这种方式传递整个令牌吗?我是否需要在不同的头中发送id_令牌?那么,您将如何通过id令牌中的角色声明来保护资源?还是我在这里遗漏了什么?感谢您没有使用id\u令牌保护资源。将角色声明放入访问令牌中。好了,现在有意义了!感谢您的帮助。添加到@PeterLea的答案中,ID令牌仅用于标识,角色基本上是授权的手段,因此在访问令牌中是有意义的。。ID令牌用于客户端对最终用户/资源所有者进行身份验证,并使用ID令牌获取其信息,对资源的访问完全由访问令牌控制