我可以使用OAuth对受信任的客户端(移动应用)进行身份验证吗?

时间:2019-07-10 06:30:46

标签: authentication oauth oauth-2.0 openid-connect

我知道OAuth2和OpenID Connect的工作方式。但是仍然有些困惑困扰着我。

我们开发了自己的Auth Server,服务API和移动应用。因此,客户端应用程序是受信任的,并且我们使用“密码”授予类型。应用程序用户存储库遵循身份验证服务器中的相同用户数据库。

我们的客户通过用户名/密码登录到该应用程序。然后,该应用将用户凭据提交到Auth Server令牌端点,该端点将(承载)访问令牌和ID令牌(JWT)返回给客户端。 ID令牌包含基本的用户信息,以便该应用程序可以像“ Welcome Tony Stark!”那样欢迎用户。 该访问令牌可用于访问API(例如更新用户个人资料)。

根据设计,OAuth不是用于身份验证的工具。参考:https://www.scottbrady91.com/OAuth/OAuth-is-Not-Authentication

我的问题是

1)如果仅客户端仅对获取用户信息感兴趣,我们是否需要验证ID令牌的签名?另外请注意,ID令牌是通过https连接来自令牌端点的。

2)让我们忘记ID令牌。如果客户端从Auth Server获得访问令牌,我们是否可以认为用户已通过身份验证检查(即登录成功)?此流程非常类似于没有OAuth的简单密码登录。

3)客户端可以使用访问令牌访问受保护的API。没有访问令牌,客户端只能调用某些公共API。它是否等效于登录和不登录可以做什么?似乎访问令牌可以视为“登录会话Cookie”。

4)我的案子没有第三方参与。一切(客户端,身份验证服务器,服务API)均由同一组织开发和拥有。使用OAuth仍然有意义吗?

2 个答案:

答案 0 :(得分:1)

通常,移动应用被视为公共客户端。除非您限制谁可以访问该移动应用程序,否则不能认为它是可信任的,因为即使您开发了该应用程序,也可能有人在您的控制范围之外破坏该应用程序。

此外,资源凭证授予类型通常不是一个好主意。 一件事是,OpenID Connect规范需要授权码,ID令牌或混合流:

  

身份验证可以遵循以下三种路径之一:授权代码   流(response_type = code),隐式流(response_type = id_token   令牌或response_type = id_token)或混合流(使用其他   OAuth 2.0多种响应类型中定义的响应类型值   编码惯例[OAuth.Responses])。

其他一些原因: Why the Resource Owner Password Credentials Grant Type is not Authentication nor Suitable for Modern Applications

  1. OpenID Connect RFC表示您必须验证ID令牌:
  

使用隐式流时,必须按照与第3.1.3.7节中定义的授权码流相同的方式来验证ID令牌的内容,但本节中指定的区别除外。

但是,如果使用TLS,则可能符合3.1.3.7中的例外规定:

  

如果通过客户端和令牌端点之间的直接通信(在此流程中)接收到ID令牌,则可以使用TLS服务器验证代替签发令牌签名来验证发行者。客户端必须使用JWT alg标头参数中指定的算法,根据JWS [JWS]验证所有其他ID令牌的签名。客户必须使用发行人提供的密钥。

  1. 如果您能够信任客户端,并且已经实现了用户/通过检查,那么您应该能够信任已根据OAuth 2.0将访问令牌授予了经过身份验证的身份规范。

  2. OAuth 2.0中的访问令牌也包含范围,并且应限制可以使用该访问令牌进行的操作。没有OAuth的登录不一定。

  3. 使用OAuth保护资源所有者的凭据是一个好主意。如果您使用资源所有者凭证授予类型,那么这仍然会带来一些好处,因为用户只有在客户端没有有效的访问令牌时才可以输入密码,即用户可以为访问令牌输入一次密码。并使用该密码来验证用户,而不是再次输入密码或将密码存储在某个地方。

  

即使此授予类型要求客户直接访问      资源所有者凭证,使用资源所有者凭证      单个请求,并交换访问令牌。这个      授予类型可以消除客户端存储      通过交换资源所有者凭证以供将来使用      具有长期访问令牌或刷新令牌的凭据。

OAuth 2.0 RFC6749

答案 1 :(得分:1)

  

1)如果客户端,我们是否需要验证ID令牌的签名   只对获取用户信息感兴趣吗?另请注意   ID令牌是通过https连接来自令牌端点的。

是。

  

2)让我们忘记ID令牌。我们可以请问用户已通过   如果客户端获得一个身份验证检查(即登录成功)   从Auth服务器访问令牌?这个流程非常类似于简单   没有OAuth的密码登录。

如果我了解前提。是的。不需要使用ID令牌。

  

3)客户端可以使用访问令牌访问受保护的API。不带   访问令牌,客户端只能调用一些公共API。是吗   等效于有和没有登录该怎么办?看来   访问令牌可以视为“登录会话Cookie”。

访问令牌是OAuth客户端使用的访问权限(如密钥),是从资源所有者委派的权限。

  

4)我的案子没有第三方参与。一切(客户,   身份验证服务器,服务API)由同一服务器开发并拥有   组织。使用OAuth仍然有意义吗?

是的。 OAuth和OpenID Connect已被许多组织使用,并且是一种测试解决方案。

您不应尝试重新发明“滚轮”。使用已知的可信库进行身份验证,授权和加密操作。 OpenID Connect has some certified Implementations