OAuth2.0密码授权模式中,client_id是什么的id?

有博客是这样解释的密码模式:

密码模式(resource owner password credentials):
用户向第三方客户端提供自己在授权服务端的用户名和密码,客户端通过用户提供的用户名和密码向授权服务端请求令牌(Access Token)。

Laravel使用密码授权的方式需要提交的参数如下:

$response = $http->post('http://your-app.com/oauth/token', [
    'form_params' => [
        'grant_type' => 'password',
        'client_id' => 'client-id',
        'client_secret' => 'client-secret',
        'username' => 'taylor@laravel.com',
        'password' => 'my-password',
        'scope' => '',
    ],
]);



问题:
1、代码中的client_id是什么id,每个用户每人有一个client_id还是什么意思?
2、在密码模式的概念解释中,涉及到几个参与者:
(1)用户
(2)第三方客户端
(3)授权服务端
(4)客户端
有点分不清上面4个谁是谁,请大佬举个例子让它们对号入座。谢谢大佬!

阅读 13.4k
2 个回答

client_id是你这个应用在oAuth2网站注册的应用获得的。

比如腾讯吧,虽然腾讯不一定是密码模式,但是这里举个例子。

如果你是一个A网站,需要获取用户在腾讯的账户信息,那么你需要在腾讯注册你的应用,获取你的client_id
这样在认证的时候,腾讯的OAuth就可以区分这个用户授权了哪些应用(你的A网站或者别人的B网站)。

A网站和B网站都有各自的client_id,腾讯根据这个id来区分用户给予的授权

当然了,为了防止伪造,还会另外有一个clinet_secret用于确认你使用的client_id确实是你这个网站所持有的。

还有你所不理解的几个参与者。
还是以上面的例子解释。

  • 用户 是腾讯的用户,A网站或者B网站需要用户的授权来获取用户的腾讯账户的信息。
  • 第三方客户端 就是A网站或者B网站的手机APP(网页)之类的。
  • 授权服务端 就是指腾讯啦
  • 客户端 就是指A网站或者B网站的服务器

至于为什么要分成第三方客户端客户端,这个主要是为了secret_id保密,如果你的secret_id直接写在用户应用当中,那么谁都可以用你的A网站的身份去获取用户的信息了。所以secret_id只能保存在后台。

所以在这里可以理解成客户端就是指A网站的服务器,在面对腾讯的Oauth授权的情况下,腾讯是授权服务端,A网站后台是授权的客户端。


暂时就写这么点,有说错或者还有不理解的话后面再补充

第二个问题
以某小游戏支持微信登录举例:
(1)用户:你
(2)第三方客户端:小游戏
(3)授权服务端:微信
(4)客户端:这里说的就是第三方客户端,也就是小游戏

密码模式就是你在小游戏里面输入微信的账号密码,然后小游戏拿着这个去向微信要token,然后小游戏用这个token去访问微信的api以获取你的信息或资源(所以这种方式是不太推荐的,因为你的微信账号密码告诉了第三方小游戏)


第一个问题
client_id 就是小游戏向微信注册时微信给的,表示小游戏身份的 id
client_secret 就是对应的秘钥啦

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题