得到了這個 golang 代碼,因為我的 golang 生銹了,所以請隨意批評。基本重繪 令牌流程,但是我們將函式包裝在 TX 函式中,以便在重繪 流程中出現問題時允許回滾。
我們需要回傳該newToken值,但是它僅在refresh函式回傳 refreshToken 時保存我們需要的值,具體取決于我是否將物件或指標傳遞給它,分別回傳新的空令牌或 nil。
package service
import (
"context"
"database/sql"
"errors"
"strings"
"github.com/api-oauth/pkg/models"
"github.com/api-oauth/pkg/repository"
"golang.org/x/oauth2"
)
const minParts = 2
type OAuthAPI interface {
Exchange(context.Context, string) (*oauth2.Token, error)
Refresh(context.Context, string) (*oauth2.Token, error)
}
type Service struct {
repo repository.RepoInterface
oauthAPI OAuthAPI
}
func New(api OAuthAPI, repo repository.RepoInterface) *Service {
return &Service{repo: repo, oauthAPI: api}
}
var (
ErrNoRefreshTokenFound = errors.New("no refresh token found")
errNoScopesReturn = errors.New("no scopes returned")
errNoProfileFound = errors.New("no profile found")
)
func (s *Service) RefreshToken(ctx context.Context, clientID string, userID int64) (*oauth2.Token, error) {
var newToken *oauth2.Token
err := s.repo.InTx(s.refresh(ctx, clientID, userID, newToken))
if err != nil {
return nil, err
}
return newToken, nil
}
func (s *Service) refresh(ctx context.Context, clientID string, userID int64, newToken *oauth2.Token) func(repo repository.Auth) error {
return func(repo repository.Auth) error {
oldToken, err := repo.GetToken(ctx, userID, clientID)
if err != nil && err != sql.ErrNoRows {
return err
}
if oldToken == nil {
return ErrNoRefreshTokenFound
}
newToken, err = s.oauthAPI.Refresh(ctx, oldToken.Refresh)
if err != nil {
return err
}
rec := models.TokenRecord{
UserID: userID,
ClientID: clientID,
ProfileID: oldToken.ProfileID,
Access: newToken.AccessToken,
Refresh: newToken.RefreshToken,
Expiry: newToken.Expiry,
}
err = repo.UpdateToken(ctx, &rec)
if err != nil {
return err
}
return nil
}
}
試圖RefreshToken回傳更新的令牌資訊
uj5u.com熱心網友回復:
傳遞地址newToken:
func (s *Service) RefreshToken(ctx context.Context, clientID string, userID int64) (*oauth2.Token, error) {
var newToken *oauth2.Token
err := s.repo.InTx(s.refresh(ctx, clientID, userID, &newToken))
...
并且,將refresh函式更改為:
func (s *Service) refresh(ctx context.Context, clientID string, userID int64, newToken **oauth2.Token) func(repo repository.Auth) error {
...
*newToken, err=...
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/443006.html
