我向Google或Microsoft请求openid id_token,在完成动议并同意我的应用程序openid
范围的请求后,id_token正式返回。我可以把它分成点和前两个部分,我可以解码为有效的JSON,所以它是一个JWT,毫无疑问。
但是当我尝试将其用作对[Authorize]
注释的aspnetcore WebApi方法的请求的授权标头中的承载令牌时,我得到401 Unauth,带有此标头:
WWW-Authenticate: Bearer error=invalid_token, error_description="The signature is invalid"
微软和谷歌似乎都不太可能发布dud JWT。所以现在我需要知道什么可以引起中间件的这种反应,这是当前的,并且设置如下:
app.UseJwtBearerAuthentication(new JwtBearerOptions { SaveToken = true });
如果重要,请点击令牌请求的编辑参数。
"uri": "https://accounts.google.com/o/oauth2/auth",
"parameters": {
"request_type": "token",
"response_type": "id_token",
"client_id": "REDACTED.apps.googleusercontent.com",
"redirect_uri": "https://REDACTED/",
"scope": "openid",
"state": "STATE",
"nonce": "wibble",
"allow_signup": "true"
}
显然,当我想出这个时,状态和随机数是稳定的虚拟值。
那么,无效? WTF?我尝试使用http://jwt.io检查我的代码捕获的令牌,但它似乎并不开心。标题和有效负载已解码,但我并不清楚如何验证签名,他们想要更多的值,而且我不清楚在哪里可以获得它们。对此的指导可能会有所帮助。
这是我提取它时的一个标记。
eyJhbGciOiJSUzI1NiIsImtpZCI6IjJiMmU0ZDZmMTgyMWFkNGQ3NmQ0NTUzYzk1MWI3NTYyMmFjYjY1MzkifQ.eyJhenAiOiI3ODg4NTA3NTgwMTItdTUwbnVkMDU0aDJsNDIxOXRlaXYxbzU4Mzg5am1iNnAuYXBwcy5nb29nbGV1c2VyY29udGVudC5jb20iLCJhdWQiOiI3ODg4NTA3NTgwMTItdTUwbnVkMDU0aDJsNDIxOXRlaXYxbzU4Mzg5am1iNnAuYXBwcy5nb29nbGV1c2VyY29udGVudC5jb20iLCJzdWIiOiIxMTU2NTI3NjAwMDUzMDY1MDIxNTAiLCJub25jZSI6IndpYmJsZSIsImlzcyI6ImFjY291bnRzLmdvb2dsZS5jb20iLCJpYXQiOjE0OTUyNTA0MzcsImV4cCI6MTQ5NTI1NDAzN30.Mb3E32cVeJ4dvPw-Fpj5j1GwXIFzwTaa0fvSEh7YjvR3d18hC8_G0avWYGNb6CoJzasZnsSGDLDi_s0Cfpiov0ZBoJVap69udkR1RiTbOc-WxcgtimflG80LwpPpNepEjuJfF1i1OwIFSputpXKbFQOsTP5fN4Xe7cE-EjTrHVX8zzR2v31pqrjh1o5HSK2QEQXM7eEYYvJrDMpgjtL5r22DoQdPHCZgt1Wi3XnTRn_MCD8zWX99Z6n11TpD6IWxlgzBCItlrr6nXRv1Np9ti2Mvw7p0-gCmpFiJKD60J34aqB1AJUpPFXuZWpV--KTTA3T55rC2lRg6vSueeK6QoQ
为了您的方便,这里又是分数点。
eyJhbGciOiJSUzI1NiIsImtpZCI6IjJiMmU0ZDZmMTgyMWFkNGQ3NmQ0NTUzYzk1MWI3NTYyMmFjYjY1MzkifQ
eyJhenAiOiI3ODg4NTA3NTgwMTItdTUwbnVkMDU0aDJsNDIxOXRlaXYxbzU4Mzg5am1iNnAuYXBwcy5nb29nbGV1c2VyY29udGVudC5jb20iLCJhdWQiOiI3ODg4NTA3NTgwMTItdTUwbnVkMDU0aDJsNDIxOXRlaXYxbzU4Mzg5am1iNnAuYXBwcy5nb29nbGV1c2VyY29udGVudC5jb20iLCJzdWIiOiIxMTU2NTI3NjAwMDUzMDY1MDIxNTAiLCJub25jZSI6IndpYmJsZSIsImlzcyI6ImFjY291bnRzLmdvb2dsZS5jb20iLCJpYXQiOjE0OTUyNTA0MzcsImV4cCI6MTQ5NTI1NDAzN30
Mb3E32cVeJ4dvPw-Fpj5j1GwXIFzwTaa0fvSEh7YjvR3d18hC8_G0avWYGNb6CoJzasZnsSGDLDi_s0Cfpiov0ZBoJVap69udkR1RiTbOc-WxcgtimflG80LwpPpNepEjuJfF1i1OwIFSputpXKbFQOsTP5fN4Xe7cE-EjTrHVX8zzR2v31pqrjh1o5HSK2QEQXM7eEYYvJrDMpgjtL5r22DoQdPHCZgt1Wi3XnTRn_MCD8zWX99Z6n11TpD6IWxlgzBCItlrr6nXRv1Np9ti2Mvw7p0-gCmpFiJKD60J34aqB1AJUpPFXuZWpV--KTTA3T55rC2lRg6vSueeK6QoQ
这个显然已经过期,但是如果你知道如何验证签名,那么检查我是否损坏了提取它的令牌可能很方便。 任何人都可以帮助我理解错误以及如何处理它吗?
汉斯在下面的回答似乎很可能,但现实似乎与文档不符。然后我发现了这个问题Microsoft Account OpenID authentication token request returns id_token but not access_token并得到了MSFT人员的回答。在请求范围时,您似乎只获得了身份验证令牌。这是有道理的;身份验证令牌授权访问令牌请求中指定的一个或多个资源。我的请求中指定的唯一范围是openid,这是对收到的id_token的请求。但我并没有尝试获得使用提供商范围的权限,例如用户的地址簿或电子邮件。我试图将身份验证委派给提供者。不授权。我希望建立用户的身份 - 据我所知,事情是id_token
的重点,我想使用我自己的用户角色数据库进行自己的授权定义特定于应用程序的范围。
我认为这仍然是一个值得回答的问题,即使答案是使用aspnetcore web api如何解决这个问题的缩略图,并提供相关文档的链接。
OAuth 2 access_token vs OpenId Connect id_token表明这是受支持的方案。这里的关键短语是SSO或单点登录。我开始认为这更像是一个如何针对使用aspcorenet webapi的SPA进行SSO的问题。
但最初的问题是:为什么这些令牌似乎无效 签名?
答案 0 :(得分:0)
在Google和Microsoft支持的OpenID Connect流程中,您将在授权请求的响应中同时获得id_token
和access_token
。 id_token
用于向客户端(即您的应用程序)验证用户,access_token
可用于访问API。
因此,您应该在API调用的access_token
标题中展示Authorization: bearer <token>
而不是id_token
。