12/08/2018, 17:56

[Chia sẻ] Một số tương tác với Google API: Get useremail, disconnect Google account to an application

Chào các bạn, gần đây mình đang làm dự án tương tác với Google Calendar, mình đã chia sẽ ở phần trước. Hôm nay mình sẽ chia sẽ hai vấn đề mình gặp phải trong quá trình làm việc với Google Calendar, đó là disconnect khỏi Google account và lấy email address. Ở bài trước mình đã sử dụng thư viện ...

Chào các bạn, gần đây mình đang làm dự án tương tác với Google Calendar, mình đã chia sẽ ở phần trước.

Hôm nay mình sẽ chia sẽ hai vấn đề mình gặp phải trong quá trình làm việc với Google Calendar, đó là disconnect khỏi Google account và lấy email address.

Ở bài trước mình đã sử dụng thư viện Singet để tương tác với Google API, tuy nhiên đọc qua cái doccument thì có vẻ như không có hàm nào hỗ trợ để xử lý 2 chức năng mình đã nếu ở trên.

Vì thế mình quyết định sử dụng call trực tiếp từ Google API.

Get user email

Để lấy được thông tin của user đã xác thực, trong đó có email address, bạn phải request scope cho phép lấy email của user.

Ở lần trước khi tương tác với Google Calendar mình đã request scope Google::Apis::CalendarV3::AUTH_CALENDAR, scope này không cho phép bạn lấy thông tin user.

Google API có riêng 1 scope để bạn lấy email address đó là userinfo.email.

Danh sách scope các bạn có thể xem tại đây.

Khai báo thông tin client

  def client_options
    {
      client_id: ENV["google_client_id"],
      client_secret: ENV["google_client_secret"],
      authorization_uri: "https://accounts.google.com/o/oauth2/auth",
      token_credential_uri: "https://accounts.google.com/o/oauth2/token",
      scope: "https://www.googleapis.com/auth/userinfo.email",
      redirect_uri: callback_url
    }
  end

Viết action redirect để chuyển đến trang đăng nhập yêu cầu xác thực Google

  def redirect
    client = Signet::OAuth2::Client.new client_options
    redirect_to client.authorization_uri.to_s
  end

Tiếp theo là action callback sau khi xác thực thành công

  def callback
    client = Signet::OAuth2::Client.new client_options
    client.code = params[:code]
    response = client.fetch_access_token!
    binding.pry
  end

Bỏ binding.pry ở đây để tiếp tục.

=> response
{"access_token"=>"xxxx",
 "expires_in"=>3600,
 "id_token"=> "aaaaa",
 "refresh_token"=>"yyyyyy",
 "token_type"=>"Bearer"}

Như bạn thấy sau khi xác thực thành công, Google sẽ trả về cho bạn cái token trên. Việc của bạn sẽ là lấy cái access_token để yêu cầu lấy thông tin user

=> uri = URI "https://www.googleapis.com/userinfo/v2/me?alt=json&access_token=#{response["access_token"]}"
=> result = Net::HTTP.get uri
=> JSON.parse result

Kết quả:
{"id"=>"12345678999999",
 "email"=>"le.quang.canh@framgia.com",
 "verified_email"=>true,
 "name"=>"",
 "given_name"=>"",
 "family_name"=>"",
 "picture"=>"https://lh5.googleusercontent.com/-cKvRvbDYOts/AAAAAAAAAAI/AAAAAAAAAAA/1GTtAnXZH2g/photo.jpg",
 "hd"=>"framgia.com"}

Giờ thì bạn có thể lấy thông tin và sử dụng ở đâu bạn muốn             </div>
            
            <div class=

0