#+TITLE: 通过 Firebase Authentication 进行 OAuth 授权 #+PUBLISHED: 2017-02-19 #+SLUG: oauth-via-firebase-authentication #+TAGS: firebase github oauth * 前言 在上上篇文章里,我介绍了我的新博客系统 *Solomon* ,其中就讲的到了我用了 GitHub Issue 做为评论系统。这么做有两个麻烦的地方: 1. 需要为每一篇文章创建一个 issue; 2. 评论者需要有 GitHub 帐号,然后在登录的状态下到 issue 的页面进行评论。 作为一个处女座,我觉得需要到别的页面才能评论或点赞的用户体验太糟糕了。所以,我考 虑让评论者通过 OAuth 授权的方式获得 Token,然后就可以直接在文章页面进行评论了。 * OAuth #+BEGIN_QUOTE OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储 的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用。 /via 维基百科/ #+END_QUOTE OAuth 的具体实现就是通过提供给第三方一个 *Token* ,第三方就可以通过这个 Token 在 *特定的时间* 内访问 *特定的内容* 。 既然要在 GitHub 上评论,我们就需要先在 GitHub 上注册我们的应用: 打开 [[https://github.com/settings/developers][Developer applications]] 或者进入 GitHub 的设置页面,在侧边栏里选择 *OAuth applicatioins* 。 然后选择 *Register a new application* 注册一个新的应用: [[file:/images/github-register-a-new-oauth-application.png][在 GitHub 中注册新应用]] #+BEGIN_QUOTE 注意这里有个 *Authorization callback URL* ,它是我们和 GitHub 完成授权之后的一个 重定向地址,我们下面也会介绍到。 #+END_QUOTE 填写好信息之后点击 *Register application* 。之后就可以看到这个界面,就代表我们的 应用已经注册好了。 [[file:/images/client-id-and-client-secret.png][Client ID 和 Client Secret]] 在这个页面我们还可以可以我们的 *Client ID* 和 *Client Secret* 。 *Client ID* 是用于用户和 GitHub 获得授权的时候使用的,GitHub 通过这个得知你要授 权的网站,并且会把该网站需要的权限列出来,让用户决定是否授权。 用户确认了之后就会跳转到我们上面提到的 *Callback URL* ,并且返回一个 *code* 。 我们在得到了 *code* 之后,将它和 *Client Secret* 传给 GitHub,GitHub 就会返回一 个有时限的 *access_token* ,通过这个 token 我们就能访问到 GitHub 的资源了。 但是,OAuth 授权的话意味着需要有服务器帮我们完全上述内容。这对于我这种静态博客来 说是一大困难。本身就是为了节省打理服务器的时间而选择了静态博客,现在为了一个评论 的功能再引入一个服务器,不免有点本末倒置。 所幸,托管我的网站的 Firebase 提供了 [[https://firebase.google.com/docs/auth/][Firebasee Authentication]],让我们可以通过 Firebasee 的服务器完成整个授权过程。 * Firebase Authentication 关于 Firebase 的介绍在上上一篇我简要的介绍过了。Firebase Authentication 则是 Firebase 提供的一个身份验证服务。 Firebase Authentication 不仅可以使用 *传统的邮箱密码验证* ,还引入了一些比较流行 的身份提供商,例如: *Google* , *Facebook* 和 *Twitter* 等: [[file:/images/firebase-sign-in-providers.png]] 此外,Firebase Authentication 利用了行业标准:我们上面提到的 *OAuth 2.0* 和 *OpenID* 等,所以也可以集成到自定义的后端里。 要使用 Firebase Authentication 需要先进行一下配置:首先登录到 [[https://console.firebase.google.com/][Firebase Console]]。 然后在侧边栏里选择 *Authentication* ,然后选择 *Sign-in Method* 子选项卡: [[file:/images/firebase-auth-sign-in-method.png]] 接下来开启 GitHub 认证,填写我们的 *Client ID* 和 *Client secret* : [[file:/images/firebase-github-previders.png]] 注意到下面地址了吗?那个就是我们的 *回调地址* ,保存好 Firebase 这边的设置之后。 我们需要回到 GitHub,把回调地址改成 Firebase 提供给我们的那个: [[file:/images/github-oauth-callback-url.png]] #+BEGIN_QUOTE 为了安全,Firebase 限制了只有通过认证的域名才可以通过完全整个用户认证的过程。默 认的认证的域名只有 localhost 和你项目的默认地址。 所以,如果你使用了自定义域名的话。还需要把你的域名加到 *OAuth redirect domains* 里: [[file:/images/firebase-oauth-redirect-domains.png]] #+END_QUOTE * Angularfire2 GitHub 和 Firebase 都设置好之后,就可以正式的使用了。 Firebase Authentication 提供了两种使用方法:[[https://github.com/firebase/FirebaseUI-Web][FirebaseUI]] 和 [[https://firebase.google.com/docs/auth/web/github-auth][Firebase Authentication SDK]]。 FirebaseUI 尚处于测试阶段,所以我这里选择用 Firebase Authentication SDK。 Firebase 提供的 [[https://github.com/firebase/quickstart-js/blob/master/auth/github-popup.html][Demo]] 是在应用的 HTML 中加入 ~firebase.js~ 文件,然后在 ~