如何使用OAuth 2.0实施REST API以进行多个客户端访问

马杜里卡·维利维塔(Madurika Welivita)

我有如下要求,以使用OAuth 2.0和Web Api实现REST API。

REST API应该允许-创建,更新,查看和删除订单-创建,更新,查看和删除库存

任何类型的外部客户端(例如Web应用程序,移动应用程序,Windows / Web服务等)都应该能够使用API​​。

外部客户允许的角色:订单管理,库存管理我们的系统将不管理外部客户的用户数据(角色,权限)。

注意:可以有另外两个角色,例如Internal,External。因为外部用户不允许使用删除功能。

订单和库存数据将在当前Windows /桌面应用程序已经使用的SQL Server数据库中进行管理。通过新的API发出的订单,库存应保存在同一数据库中。

问题:

  1. 我可以使用哪种资助类型?
  2. 我应该如何管理外部客户的数据(允许的角色,客户ID,令牌)?我是否需要为此使用单独的会员数据库?我可以将现有数据库与新表一起使用吗?
查米卡·桑达马尔(Chamika Sandamal)

您可以使用Microsoft.Owin.Security.OAuth提供程序。请看下面的示例。

创建新的OwinStartup文件并按Configuration以下方法更改方法

public void Configuration(IAppBuilder app)
{
    var oauthProvider = new OAuthAuthorizationServerProvider
    {
        OnGrantClientCredentials = async context =>
        {

            var claimsIdentity = new ClaimsIdentity(context.Options.AuthenticationType);
            // based on clientId get roles and add claims
            claimsIdentity.AddClaim(new Claim(ClaimTypes.Role, "Developer"));
            claimsIdentity.AddClaim(new Claim(ClaimTypes.Role, "Developer2"));
            context.Validated(claimsIdentity);
        },
        OnValidateClientAuthentication = async context =>
        {
            string clientId;
            string clientSecret;
            // use context.TryGetBasicCredentials in case of passing values in header
            if (context.TryGetFormCredentials(out clientId, out clientSecret))
            {
                if (clientId == "clientId" && clientSecret == "secretKey")
                {
                    context.Validated(clientId);
                }
            }
        }
    };
    var oauthOptions = new OAuthAuthorizationServerOptions
    {
        AllowInsecureHttp = true,
        TokenEndpointPath = new PathString("/accesstoken"),
        Provider = oauthProvider,
        AuthorizationCodeExpireTimeSpan = TimeSpan.FromMinutes(1),
        AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(3),
        SystemClock = new SystemClock()
    };
    app.UseOAuthAuthorizationServer(oauthOptions);
    app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions());

    var config = new HttpConfiguration();
    config.MapHttpAttributeRoutes();
    app.UseWebApi(config);
}

并像这样授权您的API

[Authorize(Roles = "Developer")]
// GET: api/Tests
public IEnumerable<string> Get()
{
    return new string[] { "value1", "value2" };
}

您可以像下面那样食用它,

string baseAddress = "http://localhost/";
var client = new HttpClient();

// you can pass the values in Authorization header or as form data
//var authorizationHeader = Convert.ToBase64String(Encoding.UTF8.GetBytes("clientId:secretKey"));
//client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", authorizationHeader);

var form = new Dictionary<string, string>
    {
        {"grant_type", "client_credentials"},
        {"client_id", "clientId"},
        {"client_secret", "secretKey"},
    };

var tokenResponse = client.PostAsync(baseAddress + "accesstoken", new FormUrlEncodedContent(form)).Result;
var token = tokenResponse.Content.ReadAsAsync<Token>(new[] { new JsonMediaTypeFormatter() }).Result;
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", token.AccessToken);
var authorizedResponse = client.GetAsync(baseAddress + "/api/Tests").Result;

令牌.cs

internal class Token
{
    [JsonProperty("access_token")]
    public string AccessToken { get; set; }

    [JsonProperty("token_type")]
    public string TokenType { get; set; }

    [JsonProperty("expires_in")]
    public int ExpiresIn { get; set; }

    [JsonProperty("refresh_token")]
    public string RefreshToken { get; set; }
}

您问题的答案

  1. 您可以使用 client_credentials
  2. 在您自己的数据库中为每个客户维护角色,在内部OnGrantClientCredentials只需按客户ID获取角色并分配为声明即可。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用OAuth 2.0实施REST API以进行多个客户端访问

来自分类Dev

如何对由Azure AD B2C保护的资源实施客户端API访问

来自分类Dev

对于B2B企业REST API,在oAuth2中请求访问令牌是否会使先前授予该客户端ID的访问令牌无效?

来自分类Dev

如何使用服务帐户oauth2 Python客户端通过Google Email Settings API进行身份验证?

来自分类Dev

如何使用rest api从keycloak客户端注册中获取初始访问令牌?

来自分类Dev

Quarkus Rest客户端和OAuth2

来自分类Dev

使用Java REST客户端示例访问CAS REST API

来自分类Dev

在OAuth2中,如果一个客户端不应该共享其访问令牌,那么多个客户端如何才能访问同一资源?

来自分类Dev

使用Socrata API实施OAuth2

来自分类Dev

如何使用客户端ID和密码将OAuth实施到FastAPI

来自分类Dev

在客户端进行身份验证,如何现在保护我的Java Rest API?

来自分类Dev

Twitter Finagle客户端:如何进行外部REST api调用?

来自分类Dev

在客户端进行身份验证,如何现在保护我的Java Rest API?

来自分类Dev

Google OAuth2-使用外部生成的访问令牌-带有JS客户端库

来自分类Dev

在 REST API 客户端中,您是否需要为每个端点使用多个 GET 方法?

来自分类Dev

如何使用Oauth2和javascript客户端实现长期登录会话(Spring Oauth2 + Angularjs)

来自分类Dev

使用Vue 2进行客户端表单验证

来自分类Dev

如何使用PHPLeague oAuth2客户端发出请求?

来自分类Dev

如何使用Spring在OAuth2身份验证中生成客户端密钥

来自分类Dev

OAuth2-受信任的客户端可以访问具有客户端凭据流的用户资源吗

来自分类Dev

使用Java低级Rest客户端进行弹性搜索

来自分类Dev

如何向客户端公开 REST api 微服务?

来自分类Dev

如何使用Koa2和koa-router将REST api的GET响应发送到React客户端?

来自分类Dev

Spring OAuth2:如何只允许用户使用自己的 ID 访问 /rest/users/{id}?

来自分类Dev

是否可以使用REST API测试简单的客户端脚本?不是REST API的测试客户端

来自分类Dev

客户端机密+在Spring OAuth2中刷新访问令牌

来自分类Dev

从Android客户端获取django OAuth2工具包访问令牌

来自分类Dev

是否有任何Node.js客户端库可以对Twitter,Facebook,Google,LinkedIn等进行OAuth和OAuth2 API调用?

来自分类Dev

如何在 WEB API 中使用 SignalR 2,从 API 和客户端调用 SignalR 方法

Related 相关文章

  1. 1

    如何使用OAuth 2.0实施REST API以进行多个客户端访问

  2. 2

    如何对由Azure AD B2C保护的资源实施客户端API访问

  3. 3

    对于B2B企业REST API,在oAuth2中请求访问令牌是否会使先前授予该客户端ID的访问令牌无效?

  4. 4

    如何使用服务帐户oauth2 Python客户端通过Google Email Settings API进行身份验证?

  5. 5

    如何使用rest api从keycloak客户端注册中获取初始访问令牌?

  6. 6

    Quarkus Rest客户端和OAuth2

  7. 7

    使用Java REST客户端示例访问CAS REST API

  8. 8

    在OAuth2中,如果一个客户端不应该共享其访问令牌,那么多个客户端如何才能访问同一资源?

  9. 9

    使用Socrata API实施OAuth2

  10. 10

    如何使用客户端ID和密码将OAuth实施到FastAPI

  11. 11

    在客户端进行身份验证,如何现在保护我的Java Rest API?

  12. 12

    Twitter Finagle客户端:如何进行外部REST api调用?

  13. 13

    在客户端进行身份验证,如何现在保护我的Java Rest API?

  14. 14

    Google OAuth2-使用外部生成的访问令牌-带有JS客户端库

  15. 15

    在 REST API 客户端中,您是否需要为每个端点使用多个 GET 方法?

  16. 16

    如何使用Oauth2和javascript客户端实现长期登录会话(Spring Oauth2 + Angularjs)

  17. 17

    使用Vue 2进行客户端表单验证

  18. 18

    如何使用PHPLeague oAuth2客户端发出请求?

  19. 19

    如何使用Spring在OAuth2身份验证中生成客户端密钥

  20. 20

    OAuth2-受信任的客户端可以访问具有客户端凭据流的用户资源吗

  21. 21

    使用Java低级Rest客户端进行弹性搜索

  22. 22

    如何向客户端公开 REST api 微服务?

  23. 23

    如何使用Koa2和koa-router将REST api的GET响应发送到React客户端?

  24. 24

    Spring OAuth2:如何只允许用户使用自己的 ID 访问 /rest/users/{id}?

  25. 25

    是否可以使用REST API测试简单的客户端脚本?不是REST API的测试客户端

  26. 26

    客户端机密+在Spring OAuth2中刷新访问令牌

  27. 27

    从Android客户端获取django OAuth2工具包访问令牌

  28. 28

    是否有任何Node.js客户端库可以对Twitter,Facebook,Google,LinkedIn等进行OAuth和OAuth2 API调用?

  29. 29

    如何在 WEB API 中使用 SignalR 2,从 API 和客户端调用 SignalR 方法

热门标签

归档