[auth] Allow using tokens that are close to being expired.

With addition of external credential helpers and ADC, the auth
library has much less control over how tokens are refreshed. In
particular, it is generally impossible to guarantee that an act
of "refreshing a token" via a token provider actually refreshes
the token.

In practice, ADC seems to be reusing the internal cached token
until it has 10s of its lifetime left.

Reclient's credential helper is even more extreme: it refreshes
the cached token only **after** it has expired already (meaning
it is impossible to avoid using expired tokens when working with
reclient credential helper, this will need to be fixed separately).

To make using such token providers less painful, do following
changes:
  1. Relax timings on how in advance we want tokens to be
     refreshed (2 min => 10 sec, plus few more).
  2. Convert "token wasn't actually refreshed" situation from
     an error into a warning. Keep using the token, even though
     it might be 1ms away from expiry (YOLO style).

(1) may result in auth errors in case RPC calls are getting stuck
for more than 10s before reaching the backend. But somehow ADC is
using this 10s value, so probably it is fine in practice.

R=iannucci@chromium.org
BUG=b/414989137

Change-Id: I0eb5826cea1dbbc82a4ba5a60f8365218a55b46c
Reviewed-on: https://chromium-review.googlesource.com/c/infra/luci/luci-go/+/6533623
Reviewed-by: Robbie Iannucci <iannucci@google.com>
Commit-Queue: Vadim Shtayura <vadimsh@chromium.org>
7 files changed
tree: a37475a978571c0aa9a60040bbedbef5eb5970aa
  1. analysis/
  2. appengine/
  3. auth/
  4. auth_service/
  5. bisection/
  6. build/
  7. buildbucket/
  8. casviewer/
  9. cipd/
  10. cipkg/
  11. client/
  12. common/
  13. config/
  14. config_service/
  15. cv/
  16. deploy/
  17. examples/
  18. gae/
  19. gce/
  20. grpc/
  21. hardcoded/
  22. led/
  23. logdog/
  24. luci_notify/
  25. lucicfg/
  26. lucictx/
  27. luciexe/
  28. mailer/
  29. milo/
  30. mmutex/
  31. provenance/
  32. recipes_py/
  33. resultdb/
  34. scheduler/
  35. scripts/
  36. server/
  37. source_index/
  38. standalone/
  39. starlark/
  40. swarming/
  41. teams/
  42. third_party/
  43. tokenserver/
  44. tools/
  45. tree_status/
  46. vpython/
  47. web/
  48. .gitallowed
  49. .gitignore
  50. .go-lintable
  51. AUTHORS
  52. codereview.settings
  53. CONTRIBUTING.md
  54. CONTRIBUTORS
  55. go.mod
  56. go.sum
  57. LICENSE
  58. OWNERS
  59. PRESUBMIT.py
  60. README.md
  61. staticcheck.conf
  62. tools.go
  63. WATCHLISTS
README.md

luci-go: LUCI services and tools in Go

GoReference

Installing

LUCI Go code is meant to be worked on from an Chromium infra.git checkout, which enforces packages versions and Go toolchain version. First get fetch via depot_tools.git then run:

fetch infra
cd infra/go
eval `./env.py`
cd src/go.chromium.org/luci

It is now possible to directly install tools with go install:

go install go.chromium.org/luci/auth/client/cmd/...@latest
go install go.chromium.org/luci/buildbucket/cmd/...@latest
go install go.chromium.org/luci/cipd/client/cmd/...@latest
go install go.chromium.org/luci/client/cmd/...@latest
go install go.chromium.org/luci/cv/cmd/...@latest
go install go.chromium.org/luci/gce/cmd/...@latest
go install go.chromium.org/luci/grpc/cmd/...@latest
go install go.chromium.org/luci/logdog/client/cmd/...@latest
go install go.chromium.org/luci/luci_notify/cmd/...@latest
go install go.chromium.org/luci/lucicfg/cmd/...@latest
go install go.chromium.org/luci/luciexe/legacy/cmd/...@latest
go install go.chromium.org/luci/mailer/cmd/...@latest
go install go.chromium.org/luci/mmutex/cmd/...@latest
go install go.chromium.org/luci/resultdb/cmd/...@latest
go install go.chromium.org/luci/server/cmd/...@latest
go install go.chromium.org/luci/swarming/cmd/...@latest
go install go.chromium.org/luci/tokenserver/cmd/...@latest
go install go.chromium.org/luci/tools/cmd/...@latest

Contributing

Contributing uses the same flow as Chromium contributions.