OAuth

Oauth是一种授权机制, 用来授权第三方应用, 获取相关数据

实际应用场景举例:

  • 授权打印应用能打印用户云相册里的图片

    那么打印应用需要进入到用户云相册里面获取图片, 我们可以把用户名和密码提供给打印应用就解决了

    但是稍微细想一下, 就会发现有很大的安全隐患, 应用会不会获取云相册里的其他信息(我只想给他获取某个相册的权限)? 应用会不会把用户名和密码泄露给其他人?

    所以有没有一种机制可以授权部分权限给第三方应用, 而不用提供用户名和密码呢?

  • 应用不建立自己的用户名和密码认证系统, 采用联合认证

    应用建立自己的用户名和密码认证系统, 被业界认为是不安全的行为, 而且对用户来说也很麻烦, 需要注册, 设置密码, 等等

    那么应用可以不可以利用用户的其他常用的账号来进行认证呢? 比如微信, 而不用新注册一个账号

上面两个场景就需要用到Oauth, 我们已第二种场景, 用微信认证做例子, 说明这种机制的过程:

  1. 应用开发者在微信上注册一个账号, 获取到client id和client secret, 以及设置一个自己的跳转url
  2. 当用户点击微信登录时, 服务器会拿client id想微信的认证地址请求, 此时跳转到一个界面, 需要用户扫码认证, 并且同意授权
  3. 此时会跳转到应用开发者设置的跳转url, 并且微信平台会提供一个有过期时间的code
  4. 在这个url的后台逻辑里, 会用提供的code, 以及client id和client secret向微信提供token的接口请求, 从而获得token
  5. 后台在用这个token去微信提供的用户信息api接口, 来获取用户信息, 如果用户是第一次登陆, 那么可以将用户信息写入自己的数据库(如果不是, 则跳过这一步)
  6. 这样就完成认证了, 跳转到应用自己的业务界面里面即可

如果是Django应用, 想创建自己的Oauth中心, 则可以利用django-oauth-toolkit来做, 按照官方文档做一遍, 就能比较清晰的理解OAuth了