我目前正在学习.Net的OAuth2服务器,似乎OWIN提供了一个很好的解决方法来轻松实现这种服务器。
我尝试了Microsoft的例子:https://learn.microsoft.com/en-us/aspnet/aspnet/overview/owin-and-katana/owin-oauth-20-authorization-server
似乎该示例效果很好,但是当我尝试通过PostMan将授权代码换成访问令牌时,它失败了。
我在请求正文中使用了带有标头Content-Type=application/x-www-form-urlencoded
和以下参数的 POST 方法:
grant_type=authorization_code
client_id=7890ab
redirect_uri=http%3A%2F%2Flocalhost%3A50150%2Fcallback%2F
code=d7a91a351ffa4764a22ef3628c94d495443e0043bfc9405b9f1c5113a234a23d
client_secret=7890ab
我跟踪调试器并发现进程传递的事件ReceiveAuthenticationCode
并且票证应该已结算/反序列化。
然而,无论我如何尝试,结果总是invalid_grant。
我已经查看了原始示例,我发现它成功地获得了访问令牌WebServerClient
.但由于我的目的是提供服务,不仅限于 .Net 客户端,所以我必须确保我可以在没有库的情况下检索令牌。
有人有什么建议吗?
更新 1
我已经将clientID和clientSecret连接到7890ab:7890ab
并将字符串编码为base 64字符串Nzg5MGFiOjc4OTBhYg==
然后附加到标头Authorization=Basic Nzg5MGFiOjc4OTBhYg==
经过 2 周的尝试,我发现我在基本部分是错误的,我希望节省我以下程序员遇到此问题的时间;
当通过HTTP GET
方法进行Authorization Code
时,应编码redirect_uri
的值(例如http%3A%2F%2Flocalhost%3A50150%2Fcallback%2F
但是,在代码获得并通过HTTP POST
方法交易Access Token
之后,不应对请求正文中的redirect_uri
值进行编码,应http://localhost:50150/callback/
该值,这是导致返回invalid_grand的部分。
注意:请求之间的
redirect_uri
值应该相同,这意味着如果 uri 在请求Authorization Code
时以http://
开头或以/
结尾,则在请求Access Token
时,这些部分也应该存在参考:在我看来,以下演示比 MSDN 更清晰 https://github.com/yuezhongxin/OAuth2.Demo