@@ -84,35 +84,39 @@ service UserService {
8484 option (google.api.method_signature ) = "parent" ;
8585 }
8686
87- // ListUserAccessTokens returns a list of access tokens for a user.
88- rpc ListUserAccessTokens (ListUserAccessTokensRequest ) returns (ListUserAccessTokensResponse ) {
89- option (google.api.http ) = {get : "/api/v1/{parent=users/*}/accessTokens" };
87+ // ListPersonalAccessTokens returns a list of Personal Access Tokens (PATs) for a user.
88+ // PATs are long-lived tokens for API/script access, distinct from short-lived JWT access tokens.
89+ rpc ListPersonalAccessTokens (ListPersonalAccessTokensRequest ) returns (ListPersonalAccessTokensResponse ) {
90+ option (google.api.http ) = {get : "/api/v1/{parent=users/*}/personalAccessTokens" };
9091 option (google.api.method_signature ) = "parent" ;
9192 }
9293
93- // CreateUserAccessToken creates a new access token for a user.
94- rpc CreateUserAccessToken (CreateUserAccessTokenRequest ) returns (UserAccessToken ) {
94+ // CreatePersonalAccessToken creates a new Personal Access Token for a user.
95+ // The token value is only returned once upon creation.
96+ rpc CreatePersonalAccessToken (CreatePersonalAccessTokenRequest ) returns (CreatePersonalAccessTokenResponse ) {
9597 option (google.api.http ) = {
96- post : "/api/v1/{parent=users/*}/accessTokens "
97- body : "access_token "
98+ post : "/api/v1/{parent=users/*}/personalAccessTokens "
99+ body : "* "
98100 };
99- option (google.api.method_signature ) = "parent,access_token" ;
100101 }
101102
102- // DeleteUserAccessToken deletes an access token .
103- rpc DeleteUserAccessToken ( DeleteUserAccessTokenRequest ) returns (google.protobuf.Empty ) {
104- option (google.api.http ) = {delete : "/api/v1/{name=users/*/accessTokens /*}" };
103+ // DeletePersonalAccessToken deletes a Personal Access Token .
104+ rpc DeletePersonalAccessToken ( DeletePersonalAccessTokenRequest ) returns (google.protobuf.Empty ) {
105+ option (google.api.http ) = {delete : "/api/v1/{name=users/*/personalAccessTokens /*}" };
105106 option (google.api.method_signature ) = "name" ;
106107 }
107108
108- // ListUserSessions returns a list of active sessions for a user.
109- rpc ListUserSessions (ListUserSessionsRequest ) returns (ListUserSessionsResponse ) {
109+ // ListSessions returns a list of active login sessions for a user.
110+ // Each session represents a browser/device where the user is logged in.
111+ // Sessions are backed by refresh tokens with sliding expiration.
112+ rpc ListSessions (ListSessionsRequest ) returns (ListSessionsResponse ) {
110113 option (google.api.http ) = {get : "/api/v1/{parent=users/*}/sessions" };
111114 option (google.api.method_signature ) = "parent" ;
112115 }
113116
114- // RevokeUserSession revokes a specific session for a user.
115- rpc RevokeUserSession (RevokeUserSessionRequest ) returns (google.protobuf.Empty ) {
117+ // RevokeSession revokes a specific login session.
118+ // This invalidates the refresh token, forcing re-authentication on that device.
119+ rpc RevokeSession (RevokeSessionRequest ) returns (google.protobuf.Empty ) {
116120 option (google.api.http ) = {delete : "/api/v1/{name=users/*/sessions/*}" };
117121 option (google.api.method_signature ) = "name" ;
118122 }
@@ -398,9 +402,9 @@ message UserSetting {
398402 KEY_UNSPECIFIED = 0 ;
399403 // GENERAL is the key for general user settings.
400404 GENERAL = 1 ;
401- // SESSIONS is the key for user authentication sessions.
405+ // SESSIONS is the key for user login sessions (refresh tokens) .
402406 SESSIONS = 2 ;
403- // ACCESS_TOKENS is the key for access tokens .
407+ // ACCESS_TOKENS is the key for Personal Access Tokens (PATs) .
404408 ACCESS_TOKENS = 3 ;
405409 // WEBHOOKS is the key for user webhooks.
406410 WEBHOOKS = 4 ;
@@ -420,14 +424,14 @@ message UserSetting {
420424
421425 // User authentication sessions configuration.
422426 message SessionsSetting {
423- // List of active user sessions.
424- repeated UserSession sessions = 1 ;
427+ // List of active login sessions.
428+ repeated Session sessions = 1 ;
425429 }
426430
427- // User access tokens configuration.
431+ // Personal access tokens configuration.
428432 message AccessTokensSetting {
429- // List of user access tokens.
430- repeated UserAccessToken access_tokens = 1 ;
433+ // List of personal access tokens (PATs) .
434+ repeated PersonalAccessToken personal_access_tokens = 1 ;
431435 }
432436
433437 // User webhooks configuration.
@@ -487,85 +491,97 @@ message ListUserSettingsResponse {
487491 int32 total_size = 3 ;
488492}
489493
490- // User access token message
491- message UserAccessToken {
494+ // PersonalAccessToken represents a long-lived token for API/script access.
495+ // PATs are distinct from short-lived JWT access tokens used for session authentication.
496+ message PersonalAccessToken {
492497 option (google.api.resource ) = {
493- type : "memos.api.v1/UserAccessToken "
494- pattern : "users/{user}/accessTokens/{access_token }"
495- singular : "userAccessToken "
496- plural : "userAccessTokens "
498+ type : "memos.api.v1/PersonalAccessToken "
499+ pattern : "users/{user}/personalAccessTokens/{personal_access_token }"
500+ singular : "personalAccessToken "
501+ plural : "personalAccessTokens "
497502 };
498503
499- // The resource name of the access token.
500- // Format: users/{user}/accessTokens/{access_token }
504+ // The resource name of the personal access token.
505+ // Format: users/{user}/personalAccessTokens/{personal_access_token }
501506 string name = 1 [(google.api.field_behavior ) = IDENTIFIER ];
502507
503- // Output only. The access token value .
504- string access_token = 2 [(google.api.field_behavior ) = OUTPUT_ONLY ];
508+ // The description of the token.
509+ string description = 2 [(google.api.field_behavior ) = OPTIONAL ];
505510
506- // The description of the access token.
507- string description = 3 [(google.api.field_behavior ) = OPTIONAL ];
508-
509- // Output only. The issued timestamp.
510- google.protobuf.Timestamp issued_at = 4 [(google.api.field_behavior ) = OUTPUT_ONLY ];
511+ // Output only. The creation timestamp.
512+ google.protobuf.Timestamp created_at = 3 [(google.api.field_behavior ) = OUTPUT_ONLY ];
511513
512514 // Optional. The expiration timestamp.
513- google.protobuf.Timestamp expires_at = 5 [(google.api.field_behavior ) = OPTIONAL ];
515+ google.protobuf.Timestamp expires_at = 4 [(google.api.field_behavior ) = OPTIONAL ];
516+
517+ // Output only. The last used timestamp.
518+ google.protobuf.Timestamp last_used_at = 5 [(google.api.field_behavior ) = OUTPUT_ONLY ];
514519}
515520
516- message ListUserAccessTokensRequest {
517- // Required. The parent resource whose access tokens will be listed.
521+ message ListPersonalAccessTokensRequest {
522+ // Required. The parent resource whose personal access tokens will be listed.
518523 // Format: users/{user}
519524 string parent = 1 [
520525 (google.api.field_behavior ) = REQUIRED ,
521526 (google.api.resource_reference ) = {type : "memos.api.v1/User" }
522527 ];
523528
524- // Optional. The maximum number of access tokens to return.
529+ // Optional. The maximum number of tokens to return.
525530 int32 page_size = 2 [(google.api.field_behavior ) = OPTIONAL ];
526531
527532 // Optional. A page token for pagination.
528533 string page_token = 3 [(google.api.field_behavior ) = OPTIONAL ];
529534}
530535
531- message ListUserAccessTokensResponse {
532- // The list of access tokens.
533- repeated UserAccessToken access_tokens = 1 ;
536+ message ListPersonalAccessTokensResponse {
537+ // The list of personal access tokens.
538+ repeated PersonalAccessToken personal_access_tokens = 1 ;
534539
535540 // A token for the next page of results.
536541 string next_page_token = 2 ;
537542
538- // The total count of access tokens.
543+ // The total count of personal access tokens.
539544 int32 total_size = 3 ;
540545}
541546
542- message CreateUserAccessTokenRequest {
543- // Required. The parent resource where this access token will be created.
547+ message CreatePersonalAccessTokenRequest {
548+ // Required. The parent resource where this token will be created.
544549 // Format: users/{user}
545550 string parent = 1 [
546551 (google.api.field_behavior ) = REQUIRED ,
547552 (google.api.resource_reference ) = {type : "memos.api.v1/User" }
548553 ];
549554
550- // Required. The access token to create.
551- UserAccessToken access_token = 2 [(google.api.field_behavior ) = REQUIRED ];
555+ // Optional. Description of the personal access token.
556+ string description = 2 [(google.api.field_behavior ) = OPTIONAL ];
557+
558+ // Optional. Expiration duration in days (0 = never expires).
559+ int32 expires_in_days = 3 [(google.api.field_behavior ) = OPTIONAL ];
560+ }
561+
562+ message CreatePersonalAccessTokenResponse {
563+ // The personal access token metadata.
564+ PersonalAccessToken personal_access_token = 1 ;
552565
553- // Optional. The access token ID to use.
554- string access_token_id = 3 [(google.api.field_behavior ) = OPTIONAL ];
566+ // The actual token value - only returned on creation.
567+ // This is the only time the token value will be visible.
568+ string token = 2 ;
555569}
556570
557- message DeleteUserAccessTokenRequest {
558- // Required. The resource name of the access token to delete.
559- // Format: users/{user}/accessTokens/{access_token }
571+ message DeletePersonalAccessTokenRequest {
572+ // Required. The resource name of the personal access token to delete.
573+ // Format: users/{user}/personalAccessTokens/{personal_access_token }
560574 string name = 1 [
561575 (google.api.field_behavior ) = REQUIRED ,
562- (google.api.resource_reference ) = {type : "memos.api.v1/UserAccessToken " }
576+ (google.api.resource_reference ) = {type : "memos.api.v1/PersonalAccessToken " }
563577 ];
564578}
565579
566- message UserSession {
580+ // Session represents a user's login session on a specific device/browser.
581+ // Sessions are backed by refresh tokens with sliding expiration.
582+ message Session {
567583 option (google.api.resource ) = {
568- type : "memos.api.v1/UserSession "
584+ type : "memos.api.v1/Session "
569585 pattern : "users/{user}/sessions/{session}"
570586 name_field : "name"
571587 };
@@ -605,7 +621,7 @@ message UserSession {
605621 }
606622}
607623
608- message ListUserSessionsRequest {
624+ message ListSessionsRequest {
609625 // Required. The resource name of the parent.
610626 // Format: users/{user}
611627 string parent = 1 [
@@ -614,12 +630,12 @@ message ListUserSessionsRequest {
614630 ];
615631}
616632
617- message ListUserSessionsResponse {
618- // The list of user sessions.
619- repeated UserSession sessions = 1 ;
633+ message ListSessionsResponse {
634+ // The list of sessions.
635+ repeated Session sessions = 1 ;
620636}
621637
622- message RevokeUserSessionRequest {
638+ message RevokeSessionRequest {
623639 // The name of the session to revoke.
624640 // Format: users/{user}/sessions/{session}
625641 string name = 1 [(google.api.field_behavior ) = REQUIRED ];
0 commit comments