TwitterAPIを使ってOAuth2.0のフロー(Client Credentials)を確認した。

先日、以下のエントリーにて、4つあるOAuth2.0の認可フロー(Grant Type)からAuthorization Codeの流れを確認しました。

takapi86.hatenablog.com

今回は、TwitterAPIにOAuth2.0でツイートの検索ができるよう認可してもらい、実際に検索結果のjsonが返ってくるところまでやっていきたいと思います。

Client Credentialsの流れは動画で確認できます。

www.youtube.com

参考

やること・ゴール

  • 前回同様、Rubyで簡易的な実装で流れを掴んで行きたいと思います。
  • 上記にも書きましたが、TwitterAPIにOAuth2.0でツイートの検索ができるよう認可してもらい、実際に検索結果のjsonが返ってくるところまでやっていきたいと思います。

Client Credentialsについて

Client Credentialsは他の認証フロー3つとは、少し異なります。

  • ユーザ
  • リソースを保持するサービス・認可をするサービス
  • 第三者(リソースを保持するサービスのリソースを使いたい)

上記3人の登場人物がいたとすると、Client Credentials以外の認証フロー(Authorization Code, Implicit, Resource owner password credentials)は、 第三者がリソースへのアクセスの認可をしてもらうためのものです。 それに対して、Client Credentialsは認可を必要としていないリソースへアクセスする場合に使用します。

具体的にどういうこと?というと、 例えば、今回実装するTwitterAPIでは、 ‘Application-only authentication’ という認可のタイプ、以下の操作をすることが許可されます。 (TwitterAPIでは、この認可タイプ以外は、OAuth2.0に対応していないようです。)

  • ツイートの検索
  • ユーザのツイートの取得
  • ユーザー情報を取得
  • 任意のアカウントの友人やフォロワーの取得

など

反対にアクセスできないものは、

  • ツイートの投稿
  • ダイレクトメッセージの送信

など

つまり、ユーザ認可が必要のない公開されている内容のみ使用したい場合に使います。

恐らくアクセス数の制御のためだと思われます。

大まかな流れ

Client Credentials の説明を上記で行った通り、今回TwitterAPIでは、 ‘Application-only authentication’ の認可をもらいます。

流れとしては以下です。公式ページの流れに沿って実装していきます。

Application-only authentication — Twitter Developers

  • consumer_keyとconsumer_secretを取得する
  • consumer_keyとconsumer_secretをBase64エンコードし、bearer_tokenを取得する
  • bearer_tokenを使って、特定のアカウントのツイート一覧を表示する

consumer_keyとconsumer_secretを取得する

Twitter Developersにログインし、 consumer_keyとconsumer_secretをもらいます。 手順は検索すると多くの記事がでてくるので割愛します。

consumer_keyとconsumer_secretをBase64エンコードし、bearer_tokenを取得する

ここは公式ページの Step 1: Encode consumer key and secret, Step 2: Obtain a bearer token に該当します。

以下のコードにあるように、consumer_key, consumer_secretをURIエンコードし、 : で結合後、Base64エンコーディングし、リクエストを送信します。

# -*- coding: utf-8 -*-

require 'uri'
require 'net/http'
require 'openssl'
require 'base64'

consumer_key = URI.encode({ consumer_key })
consumer_secret = URI.encode({ consumer_secret })

credential = Base64.strict_encode64(consumer_key + ':' + consumer_secret)

uri = URI.parse('https://api.twitter.com/oauth2/token')
https = Net::HTTP.new(uri.host, uri.port)
https.use_ssl = true

request_body_params = 'grant_type=client_credentials'
request_header = {
  'Authorization': "Basic #{credential}",
  'Content-Type': 'application/x-www-form-urlencoded;charset=UTF-8',
  'Content-Length': request_body_params.length.to_s,
  'Accept-Encoding': 'gzip'
}

request = Net::HTTP::Post.new(uri.request_uri, request_header)
request.body = request_body_params

response = https.request(request)

puts response.code
puts response.body

成功するとステータスコード200で以下のレスポンスが返ってきます。 access_tokenbearer_token です。

{
  "token_type":"bearer",
  "access_token": { ここにアクセストークンが表示されます。 }
}

bearer_tokenを使って、特定のアカウントのツイート一覧を表示する

ここは公式ページの Step 3: Authenticate API requests with the bearer token に該当します。 ひとまず、公式のサンプル通りに実装していきます。

# -*- coding: utf-8 -*-

require 'uri'
require 'net/http'

access_token = { access_token }

uri = URI.parse('https://api.twitter.com/1.1/statuses/user_timeline.json')
https = Net::HTTP.new(uri.host, uri.port)
https.use_ssl = true

request_header = {
  'Authorization': "Bearer #{access_token}",
  'Accept-Encoding': 'gzip'
}
request_params = {
  count: '100',
  screen_name: 'twitterapi'
}

uri.query = URI.encode_www_form(request_params)
request = Net::HTTP::Get.new(uri.request_uri, request_header)

response = https.request(request)

puts response.code
puts response.body

成功するとステータスコード200でそれっぽいレスポンスがjsonで返ってきます。

せっかくなので、自分のツイートの検索してみます。 パラメータの仕様はこちらで確認しました。

GET search/tweets — Twitter Developers

# -*- coding: utf-8 -*-

require 'uri'
require 'net/http'

access_token = { access_token }

uri = URI.parse('https://api.twitter.com/1.1/search/tweets.json')
https = Net::HTTP.new(uri.host, uri.port)
https.use_ssl = true

request_header = {
  'Authorization': "Bearer #{access_token}",
  'Accept-Encoding': 'gzip'
}
request_params = {
  q: '腹痛に耐えながらnginxをビルドし直し自サービスをhttp2化した。',
  lang: 'ja',
  result_type: 'mixed',
  count: '1'
}

uri.query = URI.encode_www_form(request_params)
request = Net::HTTP::Get.new(uri.request_uri, request_header)

response = https.request(request)

puts response.code
puts response.body

結果のjsonはちゃんと見ていませんが screen_name に自分のアカウントが表示されていたので良さそうな気がします。

以上で、一通りの流れを確認しました。 今後も様々な認証・APIに触れて、API実装力を鍛えていきたい次第です。

PicasaAPIを使ってOAuth2.0のフロー(Authorization Code)を確認した。

OAuth、書籍やネット上の記事などから大まかに仕組みは理解していたのですが、具体的にリクエスト/レスポンスをどう送り合ってやりとりを行っているのかがよくわかっていませんでした。 OAuthの一連の流れを理解するために、今回は実際にOAuth2.0から認可してもらう流れをライブラリを使わずに実装していきたいと思います。

OAuth1.0はsignetureを作るのが少しメンドクサそうだったので、今回はOAuth2.0だけやります。

参考

やること・ゴール

  • Rubyで簡易的な実装で流れを掴んで行きたいと思います。
  • Google PhotosにOAuth2.0で画像をアップロードできるよう認可してもらい、実際に画像をアップロードできるようにするところまでやっていきたいと思います。 (自宅のPCはUbuntuを使っているのですが、Google PhotosのクライアントはWindowsMacしかないので、今後自作でちゃんとしたクライアント作っていくために、今回Google Photosへアップロードする流れを確認しました。)
  • Google Photosは統合前のサービスPicasa、このAPIが使えます。(Google Photosというのは残念ながらないようです。)

OAuth2.0の認可フロー(Grant Type)

今回は、今後WEBアプリケーションで使っていけるよう、上記フローのうちAuthorization Codeで実装します。

googleからクライアント ID、クライアントシークレットをもらう

Google APIs Consoleへログインし、クライアント ID、クライアント シークレットをもらいます。 手順は検索すると多くの記事がでてくるので割愛します。

今回はAuthorization Codeで実装を行うので、アプリケーションの種類ウェブ アプリケーションを選択しました。 承認済みのリダイレクト URIは、ユーザが認可のためGoogleにログイン後にリダイレクトされるURIなのですが、ここにクエリとしてアクセストークンがくっついてきます。 その他にすると、リダイレクトされず、トークンが画面に表示されるようになります。 (AndroidChromeアプリ、iOSPlayStation4にするとどういう動きになるかがわかりませんが、気になる方は調べてみると良いでしょう。)

認可コード(Authorization Code)をもらう

以下のコードで、認可コード(Authorization Code)をもらうためのログイン画面を表示します。 ここでは、uriの組み立てだけなのですが、hashでいい感じにクエリ付のuriを生成してくれるので、net/httpを使って実装しています。 (リクエストは送っていません。)

パラメータの仕様は以下です。 https://developers.google.com/identity/protocols/OpenIDConnect#authenticationuriparameters

state も指定できるので、WEBアプリケーションを実装するときにはつけておいた方が良いでしょう。

# -*- coding: utf-8 -*-

require 'uri'
require 'net/http'

client_id = { クライアントID }
redirect_uri = { リダイレクトURI } # Google APIs Consoleで登録したリダイレクトURIを入力します。異なる場合を入れた場合はエラーになります。
scope = 'https://picasaweb.google.com/data/' # Google Photosはpicasaのapiを利用しているので、次のURLを入れます。

uri = URI('https://accounts.google.com/o/oauth2/v2/auth')
params = {
  response_type: 'code',
  client_id: client_id,
  redirect_uri: redirect_uri,
  scope: scope
}
uri.query = URI.encode_www_form(params)
puts uri.to_s

ログインが完了したら、redirect_uriで指定したuriにリダイレクトされます。 その際に、クエリにcode={Authorization Code}がついてくるので、それをコピーしておきます。 WEBアプリケーションを実装する場合は、コールバック用のuriを用意しておき、Authorization Codeを取得できるようにしておくと良さそうです。

アクセストークンを取得する

以下のリクエストで、アクセストークンを取得します。 WEBアプリケーションを選択した場合は、有効期限はないため、リフレッシュトークンは発行されません。

# -*- coding: utf-8 -*-

require 'uri'
require 'net/http'
require 'openssl'

authorization_code = { 先ほど取得したauthorization_code }
client_id = { クライアントID }
client_secret = { クライアントシークレット }
redirect_uri = { リダイレクトURI }

uri = URI.parse('https://www.googleapis.com/oauth2/v4/token')
https = Net::HTTP.new(uri.host, uri.port)
https.use_ssl = true

request = Net::HTTP::Post.new(uri.request_uri)
request.set_form_data({
  code: authorization_code,
  client_id: client_id,
  client_secret: client_secret,
  redirect_uri: redirect_uri,
  grant_type: 'authorization_code'
})

response = https.request(request)

puts response.code
puts response.body

アクセストークンを使って、画像アップロード

以下のコードで画像をアップロードしてみます。

# -*- coding: utf-8 -*-

require 'uri'
require 'net/http'
require 'openssl'

user_id = { アップロードするユーザのid }
access_token = { アクセストークン }
upload_file = 'sample.jpg'

uri = URI.parse("https://picasaweb.google.com/data/feed/api/user/#{user_id}/?access_token=#{access_token}")
https = Net::HTTP.new(uri.host, uri.port)
https.use_ssl = true

request_header = {
  'Content-Type': "image/jpeg",
  'Content-Length': File.size(upload_file).to_s,
  'Slug': upload_file
}
request = Net::HTTP::Post.new(uri.request_uri, request_header)
request.body = File.read(upload_file)

response = https.request(request)

puts response.code
puts response.body

アップロードされた画像を確認する

Google Photesアクセスし、画像がアップロードされていることを確認します。

OAuth2.0でGoogle PhotosへのアクセスをGoogleに認可してもらい、実際にアップロードできるところまで確認しました。 Authorization Code以外の認可フローについてはまた別の機会にやろうと思います。

RHEL7でRailsサーバを構築した サーバの基本設定

こちらは、

RHEL7でRailsサーバを構築した - takapi86のブログ

サーバの基本設定 に関する記事です。

takapi86.hatenablog.com

OS(RHEL7)のアップデート

まずは、yum コマンドでOS(RHEL7)を更新します。

$ sudo yum -y update

ロケールの確認・変更

RHEL7からは、ロケール設定の確認・変更は ‘localectl’ コマンドを使用するようです。

こちらのサイトを参考に確認・変更します。 http://zero-config.com/centos/changelocale-002.html

現在の状態を確認します。

$ localectl status
   System Locale: LANG=ja_JP.utf8
       VC Keymap: us
      X11 Layout: us

EC2で設定したRHEL7の System Locale はデフォルトで日本語になっておりました。 VC Keymap、 X11 Layout については、SSHからの接続のみなので無視して良さそうです。

ちなみに、 System Locale の修正は以下のように行います。

localectl set-locale LANG=ja_JP.utf8 # ja_JP.utf8で設定を行う場合

日付の変更

RHEL7からは、システムの日付および時間に関する情報の設定は ‘timedatectl’ コマンドを使用するようです。

こちらのサイトを参考に確認・変更します。

第2章 日付と時刻の設定

現在の状態を確認します。

$ timedatectl status
      Local time: 土 2017-06-24 01:24:37 EDT
  Universal time: 土 2017-06-24 05:24:37 UTC
        RTC time: 土 2017-06-24 05:24:37
       Time zone: America/New_York (EDT, -0400)
     NTP enabled: yes
NTP synchronized: yes
 RTC in local TZ: no
      DST active: yes
 Last DST change: DST began at
                  日 2017-03-12 01:59:59 EST
                  日 2017-03-12 03:00:00 EDT
 Next DST change: DST ends (the clock jumps one hour backwards) at
                  日 2017-11-05 01:59:59 EDT
                  日 2017-11-05 01:00:00 EST

どうやら Time zoneAmerica/New_York になっているようなので、タイムゾーンの変更します。

$ sudo timedatectl set-timezone Asia/Tokyo

もう一度、 timedatectl status を実行し Time zoneAsia/Tokyo になっていることを確認します。

$ timedatectl status
      Local time: 土 2017-06-24 14:29:26 JST
  Universal time: 土 2017-06-24 05:29:26 UTC
        RTC time: 土 2017-06-24 05:29:26
       Time zone: Asia/Tokyo (JST, +0900)
     NTP enabled: yes
NTP synchronized: yes
 RTC in local TZ: no
      DST active: n/a

SElinuxの無効化

EC2のRHELはデフォルトでSElinuxが有効になっているようですが、現在はSElinux力がないので、実力がつくその日まで無効にしておきます。

こちらのサイトを参考に確認・変更します。

5.4. SELinux の有効化および無効化

以下の設定ファイルを修正します。

/etc/selinux/config の以下の箇所を disabled に修正します。

SELINUX=enforcing
↓
SELINUX=disabled

設定変更後は、OSの再起動が必要なので再起動します。

以上で、サーバの基本設定は完了です。

RHEL7でRailsアプリのサーバを構築した【Railsアプリケーション・Unicorn のインストール・設定】

こちらは、

RHEL7でRailsサーバを構築した - takapi86のブログ

Railsアプリケーション・Unicorn のインストール・設定 に関する記事です。

takapi86.hatenablog.com

Railsアプリケーションは完成している前提で進めます。

Railsアプリケーションをクローンする

github等からRailsアプリケーションをクローンします。

例:
$ git clone https://github.com/takapi86/yokohama-gc-schedule-api.git ~/my-app

bundler のインストー

RubyのGem管理ツールである bundler をインストールします。

gem install bundler

Node.jsのインストー

必要に応じて設定します。 必須ではないので、Node.jsを使用しない場合はスキップします。

$ sudo yum remove -y nodejs npm # 最新のバージョンをインストールしたいので、すでにインストールされている場合は削除します。
$ rpm -i https://rpm.nodesource.com/pub_6.x/el/7/x86_64/nodesource-release-el7-1.noarch.rpm
$ sudo yum -y install nodejs

sqliteのインストー

必要に応じて設定します。 必須ではないので、 sqlite を使用しない場合はスキップします。

$ sudo yum -y install sqlite

Railsアプリケーションのproduction設定

アセットのプリコンパイル

$ bundle exec rake assets:precompile RAILS_ENV=production

SECRET_KEY_BASEの設定

Railsでは config/secrets.yml にCookieのなりすまし対策のため、SECRET_KEY_BASE をCookie暗号化/復号化をしているようです。

production環境の場合、SECRET_KEY_BASE を環境変数に設定してあげる必要があります。

$ bundle exec rake secret
b1cb4a8933d20deaafb19e152217b7a53f784912ceb51dce6507e7336e671eef0136438d81604ca4c4c39cffc2ee93ba472b2d6cc597c0f4f3d39c05343dede1

動作確認のため、一時的にこの値を環境変数にセットします。

export SECRET_KEY_BASE=b1cb4a8933d20deaafb19e152217b7a53f784912ceb51dce6507e7336e671eef0136438d81604ca4c4c39cffc2ee93ba472b2d6cc597c0f4f3d39c05343dede1

各Gemのインストー

bunlde install しGemのインストールします。

$ cd ~/my-app/
$ bundle install

DB設定

$ vi config/database.yml
production:
  adapter: mysql2
  database: [DB名を入力します]
  pool: 5
  username: [DBのユーザを入力します]
  password: [DBのパスワードを入力します]
  host: localhost # 今回はDBサーバも同じサーバなので、localhostをしています。

DBマイグレーション

以下のコマンドで、アプリケーションのDB、テーブル、データを作成します。

RAILS_ENV=production rake db:create
RAILS_ENV=production rake db:migrate
RAILS_ENV=production rake db:seed

Railsアプリケーションの動作確認

最終的に sustemdで起動・停止できるようにしますが、ひとまずunicornコマンドを実行し、 productionモードで起動できるか確認します。 unicornはデフォルトでは port8080 であがるので、8080宛にアクセスして動作確認を行います。

unicorn -E production

ここまで確認ができればRailsアプリケーション側の設定は完了です。

systemd の設定

設定したRailsアプリケーションをsystemdで起動・停止できるようにします。

config/unicorn.rb を編集

systemdからは unicornの設定ファイル config/unicorn.rb の内容で起動・停止できるようにします。

必要に応じて、以下に設定を追加・削除するとよいでしょう。

# config/unicorn.rb
app_path = '/home/ec2-user/my-app'
worker_processes 2
listen "#{app_path}/tmp/sockets/unicorn.sock", :backlog => 64
listen 8080, :tcp_nopush => true
pid "#{app_path}/tmp/pids/unicorn.pid"
rails_root = File.expand_path('../../', __FILE__)
ENV['BUNDLE_GEMFILE'] = rails_root + "/Gemfile"
stderr_path "#{app_path}/log/unicorn.stderr.log"
stdout_path "#{app_path}/log/unicorn.stdout.log"
before_exec do |server|
  ENV['BUNDLE_GEMFILE'] = "#{ENV['RAILS_ROOT']}Gemfile"
end

上記の設定でサーバがあがるかひとまず unicorn コマンドで確認してみます。

unicorn -c config/unicorn.rb -E production

systemdの設定

/etc/systemd/system/unicorn.service

[Unit]
Description = unicorn Rack application server
Wants=mysqld.service
After=mysqld.service

[Service]
Environment=RAILS_ENV=production
Environment=SECRET_KEY_BASE=[SECRET_KEYを設定します。]
PIDFile=/home/ec2-user/my-app/tmp/pids/unicorn.pid
ExecStart=/home/ec2-user/.rbenv/shims/unicorn -c "/home/ec2-user/my-app/config/unicorn.rb" "/home/ec2-user/my-app/config.ru" -E production

[Install]
WantedBy = multi-user.target

自動起動の設定

$ sudo systemctl enable unicorn.service

以下のコマンドで登録できているか確認します。

$ sudo systemctl list-unit-files --type=service | grep unicorn
unicorn.service                               enabled

起動できるか確認します。

$ sudo systemctl start unicorn.service

NginxからUnicornを呼び出す

/etc/nginx/conf.d/ 以下のような設定ファイルを追加し、リバースプロキシできるようにします。 必要に応じて、以下に設定を追加・削除するとよいでしょう。

server {
  listen 80 default_server;
  server_name www.example.com;

  access_log /var/log/nginx/access.log;
  error_log /var/log/nginx/error.log;

  root /home/ec2-user/my-app/public;

  client_max_body_size 100m;
  error_page 404 /404.html;
  error_page 500 502 503 504 /500.html;
  try_files $uri/index.html $uri @unicorn;

  location @unicorn {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_pass http://localhost:8080;
  }
}

nginxを再起動します。

$ sudo systemctl restart nginx

ページにアクセスして確認する

ブラウザなどでサーバのURLへアクセスし、システムのページなどが表示されていればOKです。

表示されない場合は、ネットワーク周りやファイアウォールなどの設定を見直すとよいでしょう。

以上で、Railsアプリケーション・Unicorn のインストール・設定は完了です。

RHEL7でRailsアプリのサーバを構築した【Nginxのインストール・設定】

こちらは、

RHEL7でRailsサーバを構築した - takapi86のブログ

Nginxのインストール・設定 に関する記事です。

takapi86.hatenablog.com

Nginxのインストール・設定

Stable version(nginx-1.12.0)をインストールしていきます。

Nginxのyumリポジトリの追加

$ sudo rpm -i http://nginx.org/packages/rhel/7/noarch/RPMS/nginx-release-rhel-7-0.el7.ngx.noarch.rpm

Nginxのインストー

$ sudo yum -y install nginx

自動起動の設定

以下のコマンドでMySQL自動起動の設定を行います。

sudo systemctl enable nginx.service

nginx を起動する

$ sudo systemctl start nginx.service

デフォルトページにアクセスして確認する

サーバのURLへアクセスし、Nginxのデフォルトページが表示されていればOKです。

表示されない場合は、ネットワーク周りやファイアウォールなどの設定を見直すとよいでしょう。

以上で、nginxの設定は完了です。

RHEL7でRailsアプリのサーバを構築した

AWS EC2(RHEL7)でRailsサーバを構築したので、手順を備忘録として残しておきます。

OSはAmazon Linuxでも良かったのですが、Systemdなど、RHEL7からの機能に慣れたいという思いからRHEL7を使っています。

AWSの設定(インスタンスの立ち上げ方、セキュリティグループ、Elastic IPの設定など)はここでは取り上げません。

構成

すべて1サーバにまとめています。

やること

1.サーバの基本設定

takapi86.hatenablog.com

2.Nginxのインストール・設定

takapi86.hatenablog.com

3.MySQLのインストール・設定

takapi86.hatenablog.com

4.Rubyのインストール・設定

takapi86.hatenablog.com

5.Railsアプリケーション・Unicorn のインストール・設定

takapi86.hatenablog.com

以上、必要に応じてログの設定やセキュリティ・バックアップの設定等を追加していくと良いでしょう。

RHEL7でRailsアプリのサーバを構築した【MySQLのインストール・設定】

こちらは、

RHEL7でRailsサーバを構築した - takapi86のブログ

MySQLのインストール・設定 に関する記事です。

takapi86.hatenablog.com

MariaDBを削除する

EC2のRHELはデフォルトでMySQLと互換のあるMariaDBが入っています。 どうやら、どちらもインストールされていると競合するという噂があるので、削除してしまいます。

$ sudo yum -y remove mariadb-libs
$ sudo rm -rf /var/lib/mysql/

MySQLyumリポジトリの追加

以下のコマンドでyumリポジトリを追加します。

$ sudo yum -y localinstall https://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm

rpmについては、以下のURLから該当するものを選択しました。 https://dev.mysql.com/downloads/repo/yum/

MySQLのインストー

以下のコマンドで、 mysql, mysql-devel をインストールします。

$ sudo yum -y install mysql-community-server mysql-devel

バージョンを確認します。

$ mysqld --version
mysqld  Ver 5.7.18 for Linux on x86_64 (MySQL Community Server (GPL))

以下のコマンドでMySQL自動起動の設定を行います。

$ sudo systemctl enable mysqld.service

MySQLを起動します。

$ sudo systemctl start mysqld.service

MySQLのrootユーザーの初期パスワードを確認し、メモしておきます。

MySQL5.7からは、rootの初期パスワードは /var/log/mysqld.log に書き込まれます。

$ less /var/log/mysqld.log

このようにパスワードが含まれています。この場合だと GI(8KOU;xZvi がパスワードです。

[Note] A temporary password is generated for root@localhost: GI(8KOU;xZvi

セキュリティの初期設定

mysql_secure_installationを実行しセキュリティに関する初期設定を行います。 パスワードは先ほどメモした /var/log/mysqld.log に書かれていたものを使用します。

設定する内容については、以下のサイトを参考にするとよいでしょう。

MySQL :: MySQL 5.6 リファレンスマニュアル :: 4.4.5 mysql_secure_installation — MySQL インストールのセキュリティー改善

$ mysql_secure_installation

文字コードの設定

/etc/my.cnf に以下の設定を追加することで、デフォルトの文字コードをutf8に変更します。

character-set-server = utf8

設定後はMySQLを再起動します。

$ sudo systemctl restart mysqld.service

ユーザを作成する

rootでMySQLにログインします。

$ mysql -u root -p

今回は、外部からは参照しないので、以下の設定を追加します。

mysql> CREATE USER 'ユーザ名'@'localhost' IDENTIFIED WITH mysql_native_password BY 'パスワード';
mysql> GRANT ALL PRIVILEGES ON DB名.* TO `ユーザ名`@`localhost`;

以上で、MySQLの設定は完了です。

この手順は、以下のサイトを参考にインストールしました。

MySQL :: MySQL 5.7 Reference Manual :: 2.5.1 Installing MySQL on Linux Using the MySQL Yum Repository