使用access_token的正确方式是什么?

9 浏览
0 Comments

使用access_token的正确方式是什么?

我正在尝试使用OAuth。在这个例子中,提供者是Windows Live。重定向返回了以下片段。我在每个和号符号之前添加了换行符,以便更容易阅读。\n

access_token=EwAwA61DBAAUGCCXc8wU/zFu9QnLdZXy%2bYnElFkAAQcQQB3c7oVYQmQhyeTOiw1Tp5iA7cjrLJbEnvXVoDlu48mjv7WX35RRIK3L3miAQEUrn5ZVNRSUV8dqiZi4kIko93k2bODqpIY7r/nBRmnTTbInajZm0iF1FLjXaFJGzM/XJN4jZiZUtipwaNu66cSwbEhNVUWwZufHjE7SNDUQze3/ciGP9c%2bTampSUS23u%2bcuKrCbj8jPhFIj2Tbritf83YcVaXLJHpEYVz2a1GKHm8/TPot2MgcjD3yBOBd5b/QBImASEcdOpouiYIshi1Ddy20iYL1Jv6JRpPExeWd8q9sEfk4a%2btMHIPFJ%2bdy0e6X9nRMjlx%2bHP0FhUrOp4rADZgAACD41pKeivbukAAIVEy964MrcJsT6MwfHHf54bi9Nfhek/vARUG32qt1HId/3GgYDKcXblAk6I7qW%2boywDMa%2bck59pJms7/pEGqSkLtY%2b5M86%2bWvSG9bNAJWfQnKT1re5L4AxpbJ2J7JOw9md%2byBnt9I3hk%2bQGoY4ZoSMTtZ2QOxIH0rfgxVqrebUjAcCf1AIl7yBusgF1zJITPTBX1fLaEw48VjXjNygQq/N82%2baKZhU2ZMBTtUzgnod4SMrb/IOaQsDF6prVTihGHae6rbRL/Ul4C/au59NAijEBB9evjM6PxSMMpMmag6VTXdVeLeCBFitFwcjtRUH38yIuhPGalBnRTVHyLpm8cS06mrQM2n5j9XnMFBtQzEQEtdvtOsUkIgpVYmqZE38CEh9YAjJBxG1Xo9Pdz/DnHflfc3PWtO1xMZsP/krBMQFxQRTPBOiNv%2bH2DPF1TED35iW%2bS5VDbxjSur1dCVAPqv3Vbduia1moJ1AUYPm9P7%2bcY%2bIV3skuz4Dzk0zQPgU3h7N6zPwr0oi%2bNe548sk6Cqq/wbF7oV6ytuAc0fbedf49I7QA8x8BEruePwNWj2N6v2vJQqQm6fOC%2by7ZQSsJ9830hD6E5yp4YVht%2bux%2b8wu%2bDQ9x/VB6BXLNC%2b4Q2aIhDQmui/JMrgHXgo2okv9FywwVQdaSLXVasfrCVmqzDwGFhIC
&token_type=bearer
&expires_in=3600
&scope=wl.signin%20wl.emails
&user_id=AAAAAAAAAAAAAAAAAAAAAB1EauoOQMnYy_bu42gkx90
&state=STATE

\n然后我将其解析成名称值对,并对每个值应用decodeURIComponent。\n这给我一个access_token的值为\n

EwAwA61DBAAUGCCXc8wU/zFu9QnLdZXy+YnElFkAAQcQQB3c7oVYQmQhyeTOiw1Tp5iA7cjrLJbEnvXVoDlu48mjv7WX35RRIK3L3miAQEUrn5ZVNRSUV8dqiZi4kIko93k2bODqpIY7r/nBRmnTTbInajZm0iF1FLjXaFJGzM/XJN4jZiZUtipwaNu66cSwbEhNVUWwZufHjE7SNDUQze3/ciGP9c+TampSUS23u+cuKrCbj8jPhFIj2Tbritf83YcVaXLJHpEYVz2a1GKHm8/TPot2MgcjD3yBOBd5b/QBImASEcdOpouiYIshi1Ddy20iYL1Jv6JRpPExeWd8q9sEfk4a+tMHIPFJ+dy0e6X9nRMjlx+HP0FhUrOp4rADZgAACD41pKeivbukAAIVEy964MrcJsT6MwfHHf54bi9Nfhek/vARUG32qt1HId/3GgYDKcXblAk6I7qW+oywDMa+ck59pJms7/pEGqSkLtY+5M86+WvSG9bNAJWfQnKT1re5L4AxpbJ2J7JOw9md+yBnt9I3hk+QGoY4ZoSMTtZ2QOxIH0rfgxVqrebUjAcCf1AIl7yBusgF1zJITPTBX1fLaEw48VjXjNygQq/N82+aKZhU2ZMBTtUzgnod4SMrb/IOaQsDF6prVTihGHae6rbRL/Ul4C/au59NAijEBB9evjM6PxSMMpMmag6VTXdVeLeCBFitFwcjtRUH38yIuhPGalBnRTVHyLpm8cS06mrQM2n5j9XnMFBtQzEQEtdvtOsUkIgpVYmqZE38CEh9YAjJBxG1Xo9Pdz/DnHflfc3PWtO1xMZsP/krBMQFxQRTPBOiNv+H2DPF1TED35iW+S5VDbxjSur1dCVAPqv3Vbduia1moJ1AUYPm9P7+cY+IV3skuz4Dzk0zQPgU3h7N6zPwr0oi+Ne548sk6Cqq/wbF7oV6ytuAc0fbedf49I7QA8x8BEruePwNWj2N6v2vJQqQm6fOC+y7ZQSsJ9830hD6E5yp4YVht+ux+8wu+DQ9x/VB6BXLNC+4Q2aIhDQmui/JMrgHXgo2okv9FywwVQdaSLXVasfrCVmqzDwGFhIC 

\n据我所了解,这时候我只需要在受`[Authorization]`保护的路由中添加一个头部Authorization: Bearer和token值,但是这样做会导致返回一个具有基本类型的401未经授权。这让我有点困惑,不知道该如何继续进行。\n查看浏览器的调试信息,我看到了以下内容:\nWWW-Authenticate: Bearer error=invalid_token\n\n

    \n

  • 无效的令牌是指令牌不合适还是不能解析为令牌?
  • \n

  • 到目前为止,我的方法是否正确?
  • \n

  • 是否需要进行某种服务器配置?
  • \n

  • 建议下一步怎么做?
  • \n

\n访问令牌看起来有点像Base64,但它不是有效的Base64,我已经检查过了。仅仅考虑令牌的性质,它可能只是使用令牌发行者的私钥加密的声明。如果是这样的话,您可以通过使用发行者的公钥对令牌进行解密来检查令牌的完整性,但我不知道如何利用这个观察结果来找出为什么出现401错误。\n

更新

\n这是引入令牌检查的startup.cs代码\n

  app.UseJwtBearerAuthentication(new JwtBearerOptions
  {
    SaveToken = true,
    TokenValidationParameters = tokenValidationParameters
  });

\n这个auth0网页无法将我的令牌解码为JWT令牌。进一步阅读表明,JWT令牌有三个由点分隔的部分,每个部分都是Base64编码的,但是我从Windows Live和Google收到的令牌中都没有这个。\n所以,如果我想要JWT令牌,也许我需要重新结构化令牌请求。下一集会有更多内容。如果您知道我应该做什么,包括端点和参数等,请随时将下一集编写为答案。这个其他问题似乎很重要。

0
0 Comments

问题的出现的原因是对于如何正确使用access_token存在困惑。文章中提到了使用access_token的正确方式以及解决方法。

解决方法是在请求提供者的端点中,将access_token作为授权头部(authorization header)中的bearer token来使用,用于获取所需的范围(scope)。

以下是完整的

一个access_token就像它的名字所说的那样 - 是访问特定资源的令牌。

而JWT是一个身份令牌。要获得一个JWT,我需要做的是:

使用这个端点:https://login.microsoftonline.com/common/oauth2/v2.0/authorize

指定response_type为id_token

包含一个nonce

指定scope为openid。

但是回到如何使用access_token的问题,你需要将它作为bearer token放在授权头部中,在请求提供者的端点中获取所需的范围,例如wl.email。

0