Changed AuthManager::CreateAccessToken and AuthManager::ParseAccessToken

With this API we can handle expiration checks inside of AuthManager

BUG=25768507

Change-Id: I2fa5d428be6f0772d8b2656eb2bee71824f0d308
Reviewed-on: https://weave-review.googlesource.com/2030
Reviewed-by: Vitaly Buka <vitalybuka@google.com>
diff --git a/src/privet/auth_manager.cc b/src/privet/auth_manager.cc
index 51d7592..27a5e7e 100644
--- a/src/privet/auth_manager.cc
+++ b/src/privet/auth_manager.cc
@@ -135,25 +135,53 @@
 
 AuthManager::~AuthManager() {}
 
-// Returns "[hmac]scope:id:time".
-std::vector<uint8_t> AuthManager::CreateAccessToken(const UserInfo& user_info) {
-  std::string data_str{CreateTokenData(user_info, Now())};
+// Returns "[hmac]scope:id:expiration_time".
+std::vector<uint8_t> AuthManager::CreateAccessToken(const UserInfo& user_info,
+                                                    base::TimeDelta ttl) const {
+  std::string data_str{CreateTokenData(user_info, Now() + ttl)};
   std::vector<uint8_t> data{data_str.begin(), data_str.end()};
   std::vector<uint8_t> hash{HmacSha256(secret_, data)};
   hash.insert(hash.end(), data.begin(), data.end());
   return hash;
 }
 
-// Parses "base64([hmac]scope:id:time)".
-UserInfo AuthManager::ParseAccessToken(const std::vector<uint8_t>& token,
-                                       base::Time* time) const {
-  if (token.size() <= kSha256OutputSize)
-    return UserInfo{};
+// TODO(vitalybuka): Switch to Macaroon?
+// Parses "base64([hmac]scope:id:expriration_time)".
+bool AuthManager::ParseAccessToken(const std::vector<uint8_t>& token,
+                                   UserInfo* user_info,
+                                   ErrorPtr* error) const {
+  if (token.size() <= kSha256OutputSize) {
+    Error::AddToPrintf(error, FROM_HERE, errors::kDomain,
+                       errors::kInvalidAuthorization, "Invalid token size: %zu",
+                       token.size());
+    return false;
+  }
   std::vector<uint8_t> hash(token.begin(), token.begin() + kSha256OutputSize);
   std::vector<uint8_t> data(token.begin() + kSha256OutputSize, token.end());
-  if (hash != HmacSha256(secret_, data))
-    return UserInfo{};
-  return SplitTokenData(std::string(data.begin(), data.end()), time);
+  if (hash != HmacSha256(secret_, data)) {
+    Error::AddTo(error, FROM_HERE, errors::kDomain,
+                 errors::kInvalidAuthorization, "Invalid signature");
+    return false;
+  }
+
+  base::Time time;
+  UserInfo info = SplitTokenData(std::string(data.begin(), data.end()), &time);
+  if (info.scope() == AuthScope::kNone) {
+    Error::AddTo(error, FROM_HERE, errors::kDomain,
+                 errors::kInvalidAuthorization, "Invalid token data");
+    return false;
+  }
+
+  if (time < clock_->Now()) {
+    Error::AddTo(error, FROM_HERE, errors::kDomain,
+                 errors::kAuthorizationExpired, "Token is expired");
+    return false;
+  }
+
+  if (user_info)
+    *user_info = info;
+
+  return true;
 }
 
 std::vector<uint8_t> AuthManager::ClaimRootClientAuthToken(
diff --git a/src/privet/auth_manager.h b/src/privet/auth_manager.h
index a74e43b..8b99254 100644
--- a/src/privet/auth_manager.h
+++ b/src/privet/auth_manager.h
@@ -33,9 +33,12 @@
               base::Clock* clock = nullptr);
   ~AuthManager();
 
-  std::vector<uint8_t> CreateAccessToken(const UserInfo& user_info);
-  UserInfo ParseAccessToken(const std::vector<uint8_t>& token,
-                            base::Time* time) const;
+  std::vector<uint8_t> CreateAccessToken(const UserInfo& user_info,
+                                         base::TimeDelta ttl) const;
+
+  bool ParseAccessToken(const std::vector<uint8_t>& token,
+                        UserInfo* user_info,
+                        ErrorPtr* error) const;
 
   const std::vector<uint8_t>& GetSecret() const { return secret_; }
   const std::vector<uint8_t>& GetCertificateFingerprint() const {
diff --git a/src/privet/auth_manager_unittest.cc b/src/privet/auth_manager_unittest.cc
index a571d4f..2685be5 100644
--- a/src/privet/auth_manager_unittest.cc
+++ b/src/privet/auth_manager_unittest.cc
@@ -58,65 +58,79 @@
 }
 
 TEST_F(AuthManagerTest, CreateAccessToken) {
-  EXPECT_EQ(
-      "OUH2L2npY+Gzwjf9AnqigGSK3hxIVR+xX8/Cnu4DGf8wOjA6MTQxMDAwMDAwMA==",
-      Base64Encode(auth_.CreateAccessToken(UserInfo{AuthScope::kNone, 123})));
-  EXPECT_EQ(
-      "iZx0qgEHFF5lq+Q503GtgU0d6gLQ9TlLsU+DcFbZb2QxOjIzNDoxNDEwMDAwMDAw",
-      Base64Encode(auth_.CreateAccessToken(UserInfo{AuthScope::kViewer, 234})));
-  EXPECT_EQ("cWkAHxSBYtTFV3Va/9mcynR8iFZo2qr+8+WewmumF74zOjI1NzoxNDEwMDAwMDAw",
+  EXPECT_EQ("OUH2L2npY+Gzwjf9AnqigGSK3hxIVR+xX8/Cnu4DGf8wOjA6MTQxMDAwMDAwMA==",
             Base64Encode(
-                auth_.CreateAccessToken(UserInfo{AuthScope::kManager, 257})));
-  EXPECT_EQ(
-      "s3GnCThkQXIzGQoPDlJoiehQiJ5yy4SYUVQzMN2kY0o0OjQ1NjoxNDEwMDAwMDAw",
-      Base64Encode(auth_.CreateAccessToken(UserInfo{AuthScope::kOwner, 456})));
+                auth_.CreateAccessToken(UserInfo{AuthScope::kNone, 123}, {})));
+  EXPECT_EQ("iZx0qgEHFF5lq+Q503GtgU0d6gLQ9TlLsU+DcFbZb2QxOjIzNDoxNDEwMDAwMDAw",
+            Base64Encode(auth_.CreateAccessToken(
+                UserInfo{AuthScope::kViewer, 234}, {})));
+  EXPECT_EQ("cWkAHxSBYtTFV3Va/9mcynR8iFZo2qr+8+WewmumF74zOjI1NzoxNDEwMDAwMDAw",
+            Base64Encode(auth_.CreateAccessToken(
+                UserInfo{AuthScope::kManager, 257}, {})));
+  EXPECT_EQ("s3GnCThkQXIzGQoPDlJoiehQiJ5yy4SYUVQzMN2kY0o0OjQ1NjoxNDEwMDAwMDAw",
+            Base64Encode(
+                auth_.CreateAccessToken(UserInfo{AuthScope::kOwner, 456}, {})));
   auto new_time = clock_.Now() + base::TimeDelta::FromDays(11);
   EXPECT_CALL(clock_, Now()).WillRepeatedly(Return(new_time));
-  EXPECT_EQ(
-      "qAmlJykiPTnFljfOKSf3BUII9YZG8/ttzD76q+fII1YyOjM0NToxNDEwOTUwNDAw",
-      Base64Encode(auth_.CreateAccessToken(UserInfo{AuthScope::kUser, 345})));
+  EXPECT_EQ("qAmlJykiPTnFljfOKSf3BUII9YZG8/ttzD76q+fII1YyOjM0NToxNDEwOTUwNDAw",
+            Base64Encode(
+                auth_.CreateAccessToken(UserInfo{AuthScope::kUser, 345}, {})));
 }
 
 TEST_F(AuthManagerTest, CreateSameToken) {
-  EXPECT_EQ(auth_.CreateAccessToken(UserInfo{AuthScope::kViewer, 555}),
-            auth_.CreateAccessToken(UserInfo{AuthScope::kViewer, 555}));
+  EXPECT_EQ(auth_.CreateAccessToken(UserInfo{AuthScope::kViewer, 555}, {}),
+            auth_.CreateAccessToken(UserInfo{AuthScope::kViewer, 555}, {}));
 }
 
 TEST_F(AuthManagerTest, CreateTokenDifferentScope) {
-  EXPECT_NE(auth_.CreateAccessToken(UserInfo{AuthScope::kViewer, 456}),
-            auth_.CreateAccessToken(UserInfo{AuthScope::kOwner, 456}));
+  EXPECT_NE(auth_.CreateAccessToken(UserInfo{AuthScope::kViewer, 456}, {}),
+            auth_.CreateAccessToken(UserInfo{AuthScope::kOwner, 456}, {}));
 }
 
 TEST_F(AuthManagerTest, CreateTokenDifferentUser) {
-  EXPECT_NE(auth_.CreateAccessToken(UserInfo{AuthScope::kOwner, 456}),
-            auth_.CreateAccessToken(UserInfo{AuthScope::kOwner, 789}));
+  EXPECT_NE(auth_.CreateAccessToken(UserInfo{AuthScope::kOwner, 456}, {}),
+            auth_.CreateAccessToken(UserInfo{AuthScope::kOwner, 789}, {}));
 }
 
 TEST_F(AuthManagerTest, CreateTokenDifferentTime) {
-  auto token = auth_.CreateAccessToken(UserInfo{AuthScope::kOwner, 567});
+  auto token = auth_.CreateAccessToken(UserInfo{AuthScope::kOwner, 567}, {});
   EXPECT_CALL(clock_, Now())
       .WillRepeatedly(Return(base::Time::FromTimeT(1400000000)));
-  EXPECT_NE(token, auth_.CreateAccessToken(UserInfo{AuthScope::kOwner, 567}));
+  EXPECT_NE(token,
+            auth_.CreateAccessToken(UserInfo{AuthScope::kOwner, 567}, {}));
 }
 
 TEST_F(AuthManagerTest, CreateTokenDifferentInstance) {
-  EXPECT_NE(
-      auth_.CreateAccessToken(UserInfo{AuthScope::kUser, 123}),
-      AuthManager({}, {}).CreateAccessToken(UserInfo{AuthScope::kUser, 123}));
+  EXPECT_NE(auth_.CreateAccessToken(UserInfo{AuthScope::kUser, 123}, {}),
+            AuthManager({}, {}).CreateAccessToken(
+                UserInfo{AuthScope::kUser, 123}, {}));
 }
 
 TEST_F(AuthManagerTest, ParseAccessToken) {
   // Multiple attempts with random secrets.
+  const auto kStartTime = base::Time::FromTimeT(1412121212);
   for (size_t i = 0; i < 1000; ++i) {
+    EXPECT_CALL(clock_, Now()).WillRepeatedly(Return(kStartTime));
+
     AuthManager auth{{}, {}, &clock_};
 
-    auto token = auth.CreateAccessToken(UserInfo{AuthScope::kUser, 5});
+    auto token = auth.CreateAccessToken(UserInfo{AuthScope::kUser, 5},
+                                        base::TimeDelta::FromSeconds(i));
     base::Time time2;
-    EXPECT_EQ(AuthScope::kNone, auth_.ParseAccessToken(token, nullptr).scope());
-    EXPECT_EQ(AuthScope::kUser, auth.ParseAccessToken(token, &time2).scope());
-    EXPECT_EQ(5u, auth.ParseAccessToken(token, &time2).user_id());
-    // Token timestamp resolution is one second.
-    EXPECT_GE(1, std::abs((clock_.Now() - time2).InSeconds()));
+    UserInfo user_info;
+    EXPECT_FALSE(auth_.ParseAccessToken(token, &user_info, nullptr));
+    EXPECT_TRUE(auth.ParseAccessToken(token, &user_info, nullptr));
+    EXPECT_EQ(AuthScope::kUser, user_info.scope());
+    EXPECT_EQ(5u, user_info.user_id());
+
+    EXPECT_CALL(clock_, Now())
+        .WillRepeatedly(Return(kStartTime + base::TimeDelta::FromSeconds(i)));
+    EXPECT_TRUE(auth.ParseAccessToken(token, &user_info, nullptr));
+
+    EXPECT_CALL(clock_, Now())
+        .WillRepeatedly(
+            Return(kStartTime + base::TimeDelta::FromSeconds(i + 1)));
+    EXPECT_FALSE(auth.ParseAccessToken(token, &user_info, nullptr));
   }
 }
 
diff --git a/src/privet/mock_delegates.h b/src/privet/mock_delegates.h
index 8cede23..bc7ec93 100644
--- a/src/privet/mock_delegates.h
+++ b/src/privet/mock_delegates.h
@@ -62,9 +62,10 @@
 
 class MockSecurityDelegate : public SecurityDelegate {
  public:
-  MOCK_METHOD1(CreateAccessToken, std::string(const UserInfo&));
-  MOCK_CONST_METHOD2(ParseAccessToken,
-                     UserInfo(const std::string&, base::Time*));
+  MOCK_CONST_METHOD2(CreateAccessToken,
+                     std::string(const UserInfo&, base::TimeDelta));
+  MOCK_CONST_METHOD3(ParseAccessToken,
+                     bool(const std::string&, UserInfo*, ErrorPtr*));
   MOCK_CONST_METHOD0(GetPairingTypes, std::set<PairingType>());
   MOCK_CONST_METHOD0(GetCryptoTypes, std::set<CryptoType>());
   MOCK_METHOD1(ClaimRootClientAuthToken, std::string(ErrorPtr*));
@@ -83,7 +84,7 @@
   MOCK_METHOD0(CreateSessionId, std::string());
 
   MockSecurityDelegate() {
-    EXPECT_CALL(*this, CreateAccessToken(_))
+    EXPECT_CALL(*this, CreateAccessToken(_, _))
         .WillRepeatedly(Return("GuestAccessToken"));
 
     EXPECT_CALL(*this, ClaimRootClientAuthToken(_))
@@ -92,9 +93,10 @@
     EXPECT_CALL(*this, ConfirmClientAuthToken("DerivedClientAuthToken", _))
         .WillRepeatedly(Return(true));
 
-    EXPECT_CALL(*this, ParseAccessToken(_, _))
-        .WillRepeatedly(DoAll(SetArgPointee<1>(base::Time::Now()),
-                              Return(UserInfo{AuthScope::kViewer, 1234567})));
+    EXPECT_CALL(*this, ParseAccessToken(_, _, _))
+        .WillRepeatedly(
+            DoAll(SetArgPointee<1>(UserInfo{AuthScope::kViewer, 1234567}),
+                  Return(true)));
 
     EXPECT_CALL(*this, GetPairingTypes())
         .WillRepeatedly(Return(std::set<PairingType>{
diff --git a/src/privet/privet_handler.cc b/src/privet/privet_handler.cc
index d7e68bb..0af431b 100644
--- a/src/privet/privet_handler.cc
+++ b/src/privet/privet_handler.cc
@@ -121,10 +121,6 @@
 
 const int kAccessTokenExpirationSeconds = 3600;
 
-// Threshold to reduce probability of expiration because of clock difference
-// between device and client. Value is just a guess.
-const int kAccessTokenExpirationThresholdSeconds = 300;
-
 template <class Container>
 std::unique_ptr<base::ListValue> ToValue(const Container& list) {
   std::unique_ptr<base::ListValue> value_list(new base::ListValue());
@@ -518,23 +514,8 @@
   }
   UserInfo user_info;
   if (token != kAuthTypeAnonymousValue) {
-    base::Time time;
-    user_info = security_->ParseAccessToken(token, &time);
-    if (user_info.scope() == AuthScope::kNone) {
-      Error::AddToPrintf(&error, FROM_HERE, errors::kDomain,
-                         errors::kInvalidAuthorization,
-                         "Invalid access token: %s", token.c_str());
+    if (!security_->ParseAccessToken(token, &user_info, &error))
       return ReturnError(*error, callback);
-    }
-    time += base::TimeDelta::FromSeconds(kAccessTokenExpirationSeconds);
-    time +=
-        base::TimeDelta::FromSeconds(kAccessTokenExpirationThresholdSeconds);
-    if (time < clock_->Now()) {
-      Error::AddToPrintf(&error, FROM_HERE, errors::kDomain,
-                         errors::kAuthorizationExpired, "Token expired: %s",
-                         token.c_str());
-      return ReturnError(*error, callback);
-    }
   }
 
   if (handler->second.scope > user_info.scope()) {
@@ -740,9 +721,11 @@
   }
 
   base::DictionaryValue output;
-  output.SetString(kAuthAccessTokenKey,
-                   security_->CreateAccessToken(
-                       UserInfo{requested_auth_scope, ++last_user_id_}));
+  output.SetString(
+      kAuthAccessTokenKey,
+      security_->CreateAccessToken(
+          UserInfo{requested_auth_scope, ++last_user_id_},
+          base::TimeDelta::FromSeconds(kAccessTokenExpirationSeconds)));
   output.SetString(kAuthTokenTypeKey, kAuthorizationHeaderPrefix);
   output.SetInteger(kAuthExpiresInKey, kAccessTokenExpirationSeconds);
   output.SetString(kAuthScopeKey, EnumToString(requested_auth_scope));
diff --git a/src/privet/privet_handler_unittest.cc b/src/privet/privet_handler_unittest.cc
index c4180b9..53f1a05 100644
--- a/src/privet/privet_handler_unittest.cc
+++ b/src/privet/privet_handler_unittest.cc
@@ -196,9 +196,12 @@
 
 TEST_F(PrivetHandlerTest, ExpiredAuth) {
   auth_header_ = "Privet 123";
-  EXPECT_CALL(security_, ParseAccessToken(_, _))
-      .WillRepeatedly(DoAll(SetArgPointee<1>(base::Time()),
-                            Return(UserInfo{AuthScope::kOwner, 1})));
+  EXPECT_CALL(security_, ParseAccessToken(_, _, _))
+      .WillRepeatedly(DoAll(WithArgs<2>(Invoke([](ErrorPtr* error) {
+                              Error::AddTo(error, FROM_HERE, errors::kDomain,
+                                           "authorizationExpired", "");
+                            })),
+                            Return(false)));
   EXPECT_PRED2(IsEqualError, CodeWithReason(403, "authorizationExpired"),
                HandleRequest("/privet/info", "{}"));
 }
@@ -400,7 +403,7 @@
 TEST_F(PrivetHandlerTest, AuthPairing) {
   EXPECT_CALL(security_, IsValidPairingCode("testToken"))
       .WillRepeatedly(Return(true));
-  EXPECT_CALL(security_, CreateAccessToken(_))
+  EXPECT_CALL(security_, CreateAccessToken(_, _))
       .WillRepeatedly(Return("OwnerAccessToken"));
   const char kInput[] = R"({
     'mode': 'pairing',
@@ -421,9 +424,9 @@
   void SetUp() override {
     PrivetHandlerTest::SetUp();
     auth_header_ = "Privet 123";
-    EXPECT_CALL(security_, ParseAccessToken(_, _))
-        .WillRepeatedly(DoAll(SetArgPointee<1>(base::Time::Now()),
-                              Return(UserInfo{AuthScope::kOwner, 1})));
+    EXPECT_CALL(security_, ParseAccessToken(_, _, _))
+        .WillRepeatedly(DoAll(SetArgPointee<1>(UserInfo{AuthScope::kOwner, 1}),
+                              Return(true)));
   }
 };
 
@@ -597,9 +600,9 @@
 }
 
 TEST_F(PrivetHandlerSetupTest, GcdSetupAsMaster) {
-  EXPECT_CALL(security_, ParseAccessToken(_, _))
-      .WillRepeatedly(DoAll(SetArgPointee<1>(base::Time::Now()),
-                            Return(UserInfo{AuthScope::kManager, 1})));
+  EXPECT_CALL(security_, ParseAccessToken(_, _, _))
+      .WillRepeatedly(DoAll(SetArgPointee<1>(UserInfo{AuthScope::kManager, 1}),
+                            Return(true)));
   const char kInput[] = R"({
     'gcd': {
       'ticketId': 'testTicket',
diff --git a/src/privet/security_delegate.h b/src/privet/security_delegate.h
index d8090bd..fdf9a84 100644
--- a/src/privet/security_delegate.h
+++ b/src/privet/security_delegate.h
@@ -22,11 +22,13 @@
   virtual ~SecurityDelegate() {}
 
   // Creates access token for the given scope, user id and |time|.
-  virtual std::string CreateAccessToken(const UserInfo& user_info) = 0;
+  virtual std::string CreateAccessToken(const UserInfo& user_info,
+                                        base::TimeDelta ttl) const = 0;
 
-  // Validates |token| and returns scope and user id parsed from that.
-  virtual UserInfo ParseAccessToken(const std::string& token,
-                                    base::Time* time) const = 0;
+  // Validates |token| and returns scope, user id parsed from that.
+  virtual bool ParseAccessToken(const std::string& token,
+                                UserInfo* user_info,
+                                ErrorPtr* error) const = 0;
 
   // Returns list of pairing methods by device.
   virtual std::set<PairingType> GetPairingTypes() const = 0;
diff --git a/src/privet/security_manager.cc b/src/privet/security_manager.cc
index 46212f4..d2b7b35 100644
--- a/src/privet/security_manager.cc
+++ b/src/privet/security_manager.cc
@@ -109,19 +109,23 @@
     ClosePendingSession(pending_sessions_.begin()->first);
 }
 
-// Returns "base64([hmac]scope:id:time)".
-std::string SecurityManager::CreateAccessToken(const UserInfo& user_info) {
-  return Base64Encode(auth_manager_->CreateAccessToken(user_info));
+std::string SecurityManager::CreateAccessToken(const UserInfo& user_info,
+                                               base::TimeDelta ttl) const {
+  return Base64Encode(auth_manager_->CreateAccessToken(user_info, ttl));
 }
 
-// Parses "base64([hmac]scope:id:time)".
-UserInfo SecurityManager::ParseAccessToken(const std::string& token,
-                                           base::Time* time) const {
+bool SecurityManager::ParseAccessToken(const std::string& token,
+                                       UserInfo* user_info,
+                                       ErrorPtr* error) const {
   std::vector<uint8_t> decoded;
-  if (!Base64Decode(token, &decoded))
-    return UserInfo{};
+  if (!Base64Decode(token, &decoded)) {
+    Error::AddToPrintf(error, FROM_HERE, errors::kDomain,
+                       errors::kInvalidAuthorization,
+                       "Invalid token encoding: %s", token.c_str());
+    return false;
+  }
 
-  return auth_manager_->ParseAccessToken(decoded, time);
+  return auth_manager_->ParseAccessToken(decoded, user_info, error);
 }
 
 std::set<PairingType> SecurityManager::GetPairingTypes() const {
diff --git a/src/privet/security_manager.h b/src/privet/security_manager.h
index 2505099..f65f7bd 100644
--- a/src/privet/security_manager.h
+++ b/src/privet/security_manager.h
@@ -60,9 +60,11 @@
   ~SecurityManager() override;
 
   // SecurityDelegate methods
-  std::string CreateAccessToken(const UserInfo& user_info) override;
-  UserInfo ParseAccessToken(const std::string& token,
-                            base::Time* time) const override;
+  std::string CreateAccessToken(const UserInfo& user_info,
+                                base::TimeDelta ttl) const override;
+  bool ParseAccessToken(const std::string& token,
+                        UserInfo* user_info,
+                        ErrorPtr* error) const override;
   std::set<PairingType> GetPairingTypes() const override;
   std::set<CryptoType> GetCryptoTypes() const override;
   std::string ClaimRootClientAuthToken(ErrorPtr* error) override;
diff --git a/src/privet/security_manager_unittest.cc b/src/privet/security_manager_unittest.cc
index 7c26026..f48ec7f 100644
--- a/src/privet/security_manager_unittest.cc
+++ b/src/privet/security_manager_unittest.cc
@@ -103,7 +103,8 @@
   provider::test::FakeTaskRunner task_runner_;
   test::MockClock clock_;
   AuthManager auth_manager_{
-      {},
+      {22, 47, 23, 77, 42, 98, 96, 25, 83, 16, 9, 14, 91, 44, 15, 75, 60, 62,
+       10, 18, 82, 35, 88, 100, 30, 45, 7, 46, 67, 84, 58, 85},
       {
           59, 47, 77, 247, 129, 187, 188, 158, 172, 105, 246, 93, 102, 83, 8,
           138, 176, 141, 37, 63, 223, 40, 153, 121, 134, 23, 120, 106, 24, 205,
@@ -117,56 +118,19 @@
                             &task_runner_};
 };
 
-TEST_F(SecurityManagerTest, IsBase64) {
-  EXPECT_TRUE(
-      IsBase64(security_.CreateAccessToken(UserInfo{AuthScope::kUser, 7})));
-}
-
-TEST_F(SecurityManagerTest, CreateSameToken) {
-  EXPECT_EQ(security_.CreateAccessToken(UserInfo{AuthScope::kViewer, 555}),
-            security_.CreateAccessToken(UserInfo{AuthScope::kViewer, 555}));
-}
-
-TEST_F(SecurityManagerTest, CreateTokenDifferentScope) {
-  EXPECT_NE(security_.CreateAccessToken(UserInfo{AuthScope::kViewer, 456}),
-            security_.CreateAccessToken(UserInfo{AuthScope::kOwner, 456}));
-}
-
-TEST_F(SecurityManagerTest, CreateTokenDifferentUser) {
-  EXPECT_NE(security_.CreateAccessToken(UserInfo{AuthScope::kOwner, 456}),
-            security_.CreateAccessToken(UserInfo{AuthScope::kOwner, 789}));
-}
-
-TEST_F(SecurityManagerTest, CreateTokenDifferentTime) {
-  auto token = security_.CreateAccessToken(UserInfo{AuthScope::kOwner, 567});
-  EXPECT_CALL(clock_, Now())
-      .WillRepeatedly(Return(base::Time::FromTimeT(1400000000)));
-  EXPECT_NE(token,
-            security_.CreateAccessToken(UserInfo{AuthScope::kOwner, 567}));
-}
-
-TEST_F(SecurityManagerTest, CreateTokenDifferentInstance) {
-  AuthManager auth{{}, {}, &clock_};
-  EXPECT_NE(security_.CreateAccessToken(UserInfo{AuthScope::kUser, 123}),
-            SecurityManager(&auth, {}, "", false, &task_runner_)
-                .CreateAccessToken(UserInfo{AuthScope::kUser, 123}));
+TEST_F(SecurityManagerTest, CreateAccessToken) {
+  EXPECT_EQ("TV18I+N7cDPah7Nq6o7pl5H7DjDu5nCDf/cbdE4FZFEyOjc6MTQxMDAwMDA2MA==",
+            security_.CreateAccessToken(UserInfo{AuthScope::kUser, 7},
+                                        base::TimeDelta::FromMinutes(1)));
 }
 
 TEST_F(SecurityManagerTest, ParseAccessToken) {
-  // Multiple attempts with random secrets.
-  for (size_t i = 0; i < 1000; ++i) {
-    AuthManager auth{{}, {}, &clock_};
-    SecurityManager security{&auth, {}, "", false, &task_runner_};
-
-    std::string token =
-        security.CreateAccessToken(UserInfo{AuthScope::kUser, 5});
-    base::Time time2;
-    EXPECT_EQ(AuthScope::kUser,
-              security.ParseAccessToken(token, &time2).scope());
-    EXPECT_EQ(5u, security.ParseAccessToken(token, &time2).user_id());
-    // Token timestamp resolution is one second.
-    EXPECT_GE(1, std::abs((clock_.Now() - time2).InSeconds()));
-  }
+  UserInfo info;
+  EXPECT_TRUE(security_.ParseAccessToken(
+      "MMe7FE+EMyG4OnD2457dF5Nqh9Uiaq2iRWRzkSOW+SAzOjk6MTQxMDAwMDkwMA==", &info,
+      nullptr));
+  EXPECT_EQ(AuthScope::kManager, info.scope());
+  EXPECT_EQ(9u, info.user_id());
 }
 
 TEST_F(SecurityManagerTest, PairingNoSession) {