createした時だけじゃなく、見つかった時にもblock内を実行して更新してくれると勘違いしてた。

Railsのfind_or_create_byのblockはcreateした際にしか実行されない - Qiita
これと同じ。

tokenが更新されることを期待して、

def find_or_create_with_auth_hash!(auth_hash)
  find_or_create_by!(uid: auth_hash.uid, provider: auth_hash.provider) do |identity|
    identity.token = auth_hash.credentials.token
  end
end

みたいに書いてたんだけど、

Octokit::Unauthorized: GET https://api.github.com/user: 401 - Bad credentials

が出続けてハマった…。