【问题标题】:oAuth Asp.net Core 2.0 Web Api: machine-to-machineoAuth Asp.net Core 2.0 Web Api:机器对机器
【发布时间】:2018-02-05 22:55:07
【问题描述】:

我正在使用 Asp.Net Core 2.0 Web Api,其中一个控制器是使用 Quickbooks API 的客户 CRUD。为了能够连接到这个 API,我必须通过 oAuth 2 进行身份验证。我不能要求用户通过他在 quickbooks 上的帐户进行身份验证,任何使用这个 API 的人都应该看不到这种集成。

我的问题是:如何在 Asp.net core 2.0 上使用 oAuth 2 进行机器对机器身份验证?

我有客户 ID 和密码。我什至做了一个调用,实际上返回给我一个不记名令牌,但是当我尝试使用这个令牌时,他们的 API 返回错误 500,这让我认为我为获取令牌所做的事情是错误的。代码如下:

        var client = new RestClient("https://oauth.platform.intuit.com/oauth2/v1/tokens/bearer");
        var request = new RestRequest(Method.POST);
        request.AddHeader("cache-control", "no-cache");
        request.AddHeader("content-type", "application/x-www-form-urlencoded");
        request.AddParameter("application/x-www-form-urlencoded", "grant_type=client_credentials&client_id=xxxx&client_secret=yyy", ParameterType.RequestBody);            
        IRestResponse response = client.Execute(request);

这是回复:{"token_type":"bearer","access_token":"eyJlbmMiOixxx","expires_in":3600} 但正如我所说,这个令牌似乎无效。

你能帮帮我吗?链接,cmets,任何东西都会有用。

【问题讨论】:

  • 如何发送不记名令牌?另外,在 .NET 中执行此操作之前,您是否尝试过在 PostMan 或类似工具中执行此操作?
  • 在标题中。是的,使用他们的 oAuth 测试生成的令牌,它在发出请求时起作用:developer.intuit.com/v2/ui#/playground。我了解 oauth 的流程,问题是我无法向使用该应用程序的用户显示 quickbooks 授权屏幕,它必须是不可见的
  • 尝试将 fiddler 放在中间并检查您的 .NET 应用程序究竟是什么发布到 intuit。
  • 您是否检查了应用程序权限(又名应用程序范围?)也许您没有向客户端应用程序授予任何权限。解码令牌(是 JWT 令牌,在线查看并检查范围)。尝试使用带有 Bearer Token 的邮递员,看看是否返回解释错误。

标签: c# asp.net oauth-2.0


【解决方案1】:

我找不到机器对机器的方法。所以我做了一个页面,主要用户必须至少授权一次。由于我在 Intuit 社区上找不到任何帮助,因此我将其发布,以便对其他人有用。

Startup.cs,方法ConfigureServices

    services                
        .AddOAuth("QuickBooks", options =>
        {
            options.ClientId = Configuration["QuickBooks:ClientId"];
            options.ClientSecret = Configuration["QuickBooks:ClientSecret"];
            options.CallbackPath = new PathString("/QuickBooks/Authorize");

            options.AuthorizationEndpoint = Configuration["QuickBooks:AuthorizationEndpoint"];
            options.TokenEndpoint = Configuration["QuickBooks:TokenEndpoint"];
            options.UserInformationEndpoint = Configuration["QuickBooks:UserInformationEndpoint"];

            options.Scope.Add("com.intuit.quickbooks.accounting");
            options.Scope.Add("com.intuit.quickbooks.payment");

            options.SaveTokens = true;

            options.Events = new OAuthEvents
            {
                OnCreatingTicket = async context =>
                {
                    var resp = JsonConvert.DeserializeObject<QuickbooksAuthSettings>(context.TokenResponse.Response.ToString());
                    resp.AuthorizationCode = context.Request.Query["code"].ToString();
                    resp.RealmId = context.Request.Query["realmId"].ToString();
                    TimeSpan tsAccessToken;
                    if (TimeSpan.TryParse(resp.AccessTokenExpireStr, out tsAccessToken))
                        resp.AccessTokenExpire = DateTime.UtcNow.Add(tsAccessToken);

                    resp.RefreshTokenExpire = DateTime.UtcNow.AddSeconds(Convert.ToInt64(resp.RefreshTokenExpireStr));

                    var opts = new DbContextOptionsBuilder<AppDbContext>();
                    opts.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"));
                    var qbService = new QuickBooksService(this.Configuration, new AppDbContext(opts.Options));
                    qbService.SaveToken(resp);
                }
            };
        });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-20
    • 2017-02-13
    • 1970-01-01
    • 2018-02-08
    • 1970-01-01
    相关资源
    最近更新 更多